要求:利用所学的生成素数的算法,生成两个尽可能的素数,进一步实现RSA的加密算法。
a)简介
RSA公钥算法由 MIT 的Rivest, Shamir和Adleman在I978年提出来的。是被最广泛接受并实现的通用公钥密码算法,已成为公钥密码的国际标准。该算法的数学基础是初等数论中的欧拉定理,其安全性基于大整数因子分解的困难性。
b)算法流程
1)密钥的生成
1. 选择两个大素数 p和q,(p≠q,需要保密)
2. 计算n=p×q, j(n)=(p-1)×(q-1)
3. 选择整数 e 使 (j(n),e) =1, 1<e< j(n)
4. 计算d,使d=e-1 mod j(n),
得到:公钥为{e, n}; 私钥为{d}
2)加密(用e,n): 明文M<n, 密文C=M^e (mod n).
3)解密(用d,n): 密文C, 明文M =C^d (mod n)
c)算法实现
扩展欧几里得:
图4.1 扩展欧几里得
求模逆:
图4.2 求模逆
快速幂:
图4.3 快速幂
素数检验:
图4.4 素数检验
素数获取:
图4.5 素数获取
参数获取:
图4.6 参数获取
d)算法验证
因找不到相应格式的在线网站,直接验证能否顺利加解密(生成钥匙最大长度大于1200):
图4.7 RSA验证
e)算法破解
共模攻击: 在实现RSA的时候,有时为了方便,在共享同一消息的时候,会让多个用户使用相同的模数n,但公、私钥对不同。而这种做法是不安全的。设两个用户的公开密钥为e1和e2,且e1和e2互素,明文消息m,密文分别为c1≡me1(mod n),c2≡me2(mod n)。攻击者截获c1和c2之后,用拓展欧几里得算法求出满足re1+se2=1的两个整数r和s,由此可得c1rc2s≡mre1mse2≡mre1+se2≡m(mod n),即获取明文。
低加密指数攻击: 为了增强加密的高效性,使用较小的加密密钥e,但将消息发送给多个实体时,出现很大问题。当e=3的时候,如果明文也较小,会使得明文的三次方仍然小于n,当将多个消息通过不同模数产生密文时,可以通过中国剩余定理来求出m3对多个模数乘积的取余结果,又m3小于模数乘积,对m3直接开立方,就可以得到结果。
循环攻击: 当攻击者截获密文之后,可以对密文进行循环加密,将每次加密结果和密文进行对比,如果有哪一次的加密结果和密文相同,说明上一次的加密结果即为明文。这种攻击只有在循环加密密文,再次得到原始密文的次数比较小的时候,才是可行的。为了抵抗这种攻击,应当通过p和q的选择,使得p-1和q-1都有较大的素因子。
为了防范这些攻击,首先应当使得密钥长度足够大,NIST建议,若保密期限超过2015年,则建议至少使用2048比特长密钥。同时,p和q的选取应当满足以下几点要求:
1)p和q的长度相差不能太大。2)p和q的差值不应该太小。
3)p-1和q-1的公因数应尽可能小。4)p-1和q-1都应该有大的素数因子。
f)算法分析
安全性主要依赖于大整数因数分解的难题,试图分解模数 n的素因子是攻击RSA最直接的方法。分解方法有试除法、p±1因子分解法、二次筛因子分解法、椭圆曲线因子分解法等。但由于因子分解的时间复杂性并没有降为多项式时间,因此,因子分解还是一个计算上的难题,只是在实际使用中,需要考虑使用较大的位数,以确保无法在短时间内被破解。
g)选择工具原因
python:简洁性和描述性,且集成了多种便于使用的数,大数使用较为灵活方便。
h)实现难点
如何在合理的时间内生成尽可能大的素数以供使用。