Crypto入门-离散对数相关入门
基础知识
ElGamal
密钥生成方法:选择一个和,且有很大的素因子,选取的生成元,选择随机的,其中,计算,即得到公钥为,私钥为。
加密:选择随机的,其中,得到密文为,其中为明文。
解密:通过私钥计算:
ECC
圆锥曲线公钥密码使用形如且满足的曲线来进行计算。
对于圆锥曲线上的一个整点,规定加法为:作的切线交于圆锥曲线于另一点,过作轴的平行线交曲线于,则。规定乘法为:等于个相加,则。如果可以表示椭圆曲线中的所有点,则称为椭圆曲线的一个生成元,使称为无穷远点的最小的称为的阶。
密钥生成方法:选择一条满足性质的公开的圆锥曲线和它的生成元,再选择一个,计算,公钥为,私钥为。
加密:选择一个小于曲线的阶的随机,其中,计算,将待加密的信息编码为上的一个点,计算,其中为公钥,加密结果为。
解密:计算,得到明文。
暴力计算
当小于数量级时可考虑暴力计算,时间复杂度为。
例如以下曲线和点,求:。
暴力解法:
1 2 3 4 5 6 7 8 9
| k.<a>=GF(31337) E=EllipticCurve(k,[123,234]) P=E([233,18927]) Q=E([1926,3590]) for i in xrange(31337): if(i*P==Q): print i break
|
更高效的计算方法
在情况下,解:
1 2 3 4 5 6 7 8 9 10 11 12
| F=GF(31337) g=F(5) y=F(15676)
x=bsgs(g,y,(0,31336),operation='*')
x=discrete_log(y,g,operation='*')
x=discrete_log_rho(y,g,operation='*')
x=discrete_log_lambda(y,g,(5000,6000),operation='+')
|
椭圆曲线的情况:
1 2 3 4 5 6 7 8
| k.<a>=GF(31337) E=EllipticCurve(k,[123,234]) P=E([233,18927]) Q=E([1926,3590])
n=bsgs(P,Q,(0,31336),operation='+')
x=discrete_log(Q,P,operation='+')
|