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