Python Crypto库源码解析(二) RSA参数生成
* 版权声明 *
引用请注明出处,转载请联系: h0.1c@foxmail.com
本文主要讲解pycrypto库中RSA参数生成的实现方法。主要涉及的模块是PublicKey.RSA 和其继承模块PublicKey._RSA。
0 本文需要的背景知识
0.1 RSA算法的参数
在上一篇文章PyCrypto密码学库源码解析(一)随机数和大素数生成的0.5 RSA算法描述 中已经提到RSA的参数生成相关的内容,这里重申一次:
选择两个大的质数p和q,p不等于q,计算N=pq
选择一个整数e与(p-1)(q-1)互质,并且e小于(p-1)(q-1)。
计算d:d× e ≡ 1 (mod (p-1)(q-1))。
将p和q的记录销毁。
(N,e)是公钥,(N,d)是私钥。
0.2 RSA参数的要求
根据上文所述,可以根据参数生成过程来逐一解释参数的要求。
选择两个大的质数p和q,p不等于q
现如今主流的RSA密钥要求达到的位数是1024比特,例如在浏览器的公钥证书中存放的公钥就是1024比特的,而推荐使用的安全性较高的则是2048比特,也就是要求p*q的结果应该达到1024比特。
选择一个整数e与(p-1)(q-1)互质,并且e小于(p-1)(q-1)
这一点是数论要求的,否则会造成算法被攻击,要保障gcd(e,(p-1)(q-1))=1也就是要保证gcd(e,p-1) = gcd(e,q-1) = 1,这一点实际上在上一篇文章中(2.6 获取一个满足RSA要求的强素数)已经讲解过:
if e and is_possible_prime:
if e & 1:
if GCD (e, X-1) != 1:
is_possible_prime = 0
else:
if GCD (e, divmod((X-1),2)[0]) != 1:
is_possible_prime = 0
getStrongPrime函数在生成素数的时候,就已经将e和p-1的关系做过判断,才进行的输出。
所以目前的问题只剩下如何选择参数e,对于参数e,在库的文档中有这样一段说明:
Public RSA exponent. It must be an odd positive integer.
It is typically a small number with very few ones in its binary representation.
The default value 65537 (=0b10000000000000001
) is a safe choice: other common values are 5, 7, 17, and 257.
也就是说一般会选择65537,当然也可以选择其他给出的供选项,但是要保证一条就是一定要是奇数。
计算d:d× e ≡ 1 (mod (p-1)(q-1))
这一步只需要使用欧几里得方法求逆就可以。
最后,为了算法的安全需要将p和q的记录销毁,即使不销毁也绝对不可以泄露。
1 RSAImplementation类
在PublicKey.RSA模块中,包含RSA实现类,按照说明文档所说,该类是一个与RSA密钥相关的类,
class RSAImplementation(object):
包含有函数 _ init _, generate, construct, importKey,分别是构建函数、生成新