最近在看椭圆曲线的一道挑战题最关键的一部分是私钥求解,这也是ECC加密里面保证安全性的核心算法,破译明文问题的关键就在于如何破解私钥——即解决ECDLP问题;
截取”问题描述”
$$
选择椭圆曲线上的一点
P = [0x4f1ecacc3b1e56066b02f6a6033f940fc5c9805, 0] \
Q_A = [n_A]P = [0xb50e2eb55cd84112077a5acca94b4623a8b020d7, 0],\
选择大素数 p = 0xb77902abd8db9627f5d7ceca5c17ef6c5e3b0969\任务就是求解私钥n_A啦\
‘nA = 0x9022802bb688656ee1914e6dd7f74e1ecd1d6780’
$$
把握一点就OK了,正常椭圆曲线加密里面私钥都通指采用离散对数算法形成加密,可以看作是
$$
n_A=log_PQ_A
$$
Cado-nfs安装
这里都是基于docker镜像的安装o
下载 mitchelldehaven/cado-nfs镜像
1 | docker pull mitchelldehaven/cado-nfs |
运行容器,打开交互界面
1 | docker run -it mitchelldehaven/cado-nfs /bin/bash |
编译
1 | make |
Cado-nfs使用
Cado可以分解大整数,也可以计算离散对数;不过目前测试下来cado的算力还是蛮鸡肋的,拆大整数的话如果因子分解库里有现成的就不要去算了吧,真的是
Cado分解大整数
和factor用起来差不多,几乎一样
Cado计算离散对数
1 | MultiplicativeOrder[23, 10^30 + 57, 473245325750516889002351266535] |
不知道求离散对数有没有比较快的办法,网上普遍都是先把模数大整数P-1分解,很像Pollard-Rho算法(暂时还没学【看不懂】)
看一下关于该算法的描述
通过概率组合数的增加来提高算率
目标很简单,就是求出指数x,但如果离散对数计算真那么容易,也就没如果了啊
$$
23^x ≡ 473245325750516889002351266535
mod 1000000000000000000000000000057
$$
二话不说我们直接开分
其实这里存在一些分步运算的
$$
令g=23,h=473245325750516889002351266535
\x=log_gh=\frac {log_g’h} {log_g’g}\
g’ 是运算过程的另一个基
$$
那么上一步首先计算的是log_g’h
1 | ./cado-nfs.py -dlp -ell 454197539 target=473245325750516889002351266535 1000000000000000000000000000057 |
得到结果
这次就该算log_g’g了
跑出来结果是
还是蛮快滴,毕竟数不是很大,我们的Cado还是蛮争气的嘛
接下来用sagemath开始算x
1 | p = 1000000000000000000000000000057 |
校验一下模余确实匹配
不过两亿多的指数如果要硬分解的话,给你们看看我做的测试
真的很长,这只是一小段;所以计算机真的方便了我们很多很多啊
正题
回归正题,为什么我的P和Q_A最后分解就报错呢?
暂时还没解决,毕竟是挑战题。