我正在尝试在PyCrypto的2.0.1和2.6.1版本中生成RSA密钥。
当我为RSA.generate指定一个参数时——比特数,例如4096——比如下面的代码,在2.6.1:版本中一切都很好
from Crypto.PublicKey import RSA
keys = RSA.generate(4096)
但是当我用PyCrypto2.0.1版本运行它时,我会得到以下错误:
TypeError: generate_c() takes at least 2 arguments (1 given)
我知道新的API有一个randfunc=None
,这就是它在2.6.1中工作的原因。
我的问题是,我不知道2.0.1中什么是可接受的randfunc
。我应该用什么?
您应该使用os.uradom。
引用PyCrypto文档:
randfunc(可调用)-随机数生成函数它应该接受一个整数N,并返回一个N字节长的随机数据字符串。如果未指定,将从Crypto.Random.实例化一个新的
然后是"注意"部分:
您应该始终使用加密安全的随机数生成器,例如Crypto.Rondom模块中定义的生成器;不要只使用当前时间和随机模块。
PyCrypto2.0.1中没有CryptoRandom模块,因此您不能在此处使用此方法。相反,您应该使用os.urandom()
。引用文件(强调我的):
返回一个适合加密使用的n个随机字节的字符串。
此函数从操作系统特定的随机性源返回随机字节返回的数据对于加密应用程序来说应该足够不可预测,尽管其确切质量取决于操作系统实现在类似UNIX的系统上,它将查询/dev/urandom,而在Windows上它将使用CryptGenRandom()。如果未找到随机性源,将引发NotImplementedError。
对我来说,这听起来是一个合适的randfunc选择。
我知道线程真的很旧,但我在ElGamal中尝试了同样的事情,但出现了错误:
'bytes' object is not callable
我的行是:key = ElGamal.generate(length, randfunc=os.urandom(10))