我应该使用PyCrypto 2.0.1在RSA.generate()中使用randfunc?

时间:2015-11-15 13:56:27

标签: python pycrypto

我试图在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是什么。我该怎么用?

2 个答案:

答案 0 :(得分:1)

你应该使用os.urandom。

引用PyCrypto documentation

  

randfunc(callable) - 随机数生成函数; 它应该接受一个整数N并返回一串N字节长的随机数据。如果未指定,将从Crypto.Random实例化一个新的。

然后有一个“注意”部分:

  

您应始终使用加密安全随机数生成器,例如Crypto.Random模块中定义的生成器;不要只使用当前时间和随机模块。

PyCrypto 2.0.1中没有Crypto.Random模块,所以你不能在这里使用这种方法。相反,您应该使用os.urandom()。引用文档(强调我的):

  

返回一串适合加密使用的n个随机字节。

     

此函数返回来自OS特定随机源的随机字节。 返回的数据对于加密应用程序应该是不可预测的,尽管其确切的质量取决于操作系统的实现。在类UNIX系统上,这将查询/ dev / urandom,在Windows上它将使用CryptGenRandom( )。如果未找到随机源,则将引发NotImplementedError。

这对我来说听起来像是一个合适的randfunc选择。

答案 1 :(得分:0)

我知道线程确实很旧,但是我在ElGamal中尝试了相同的操作,但出现了错误:

'bytes' object is not callable

我的行是:key = ElGamal.generate(length, randfunc=os.urandom(10))