【问题标题】:How to get Pycrypto to use my random number and not its own when creating an RSA key?创建 RSA 密钥时如何让 Pycrypto 使用我的随机数而不是它自己的?
【发布时间】:2015-02-03 00:25:51
【问题描述】:

在 PyCrypto 中,我想使用树莓派上的硬件随机数生成器创建一个 RSA 密钥。我已经可以访问 Pis hrng 中的数据,但我不知道如何使用/将该数据提供给创建 RSA 密钥RSA.generate() 的 PyCrypto 函数。

生成函数上来自 PyCrypto 的documentation 似乎表明我需要传递一个返回随机数而不是随机数本身的函数。有谁知道我如何使用我捕获的硬件随机数在 python 中创建一个 RSA 密钥,更具体地说是使用 PyCrypto。下面是我玩过的一些示例代码。

这会生成一个 RSA 密钥,但不使用真正的随机数:

#/usr/bin/python

from Crypto.PublicKey import RSA
from Crypto import Random

random_generator = Random.new().read
key = RSA.generate(1024, random_generator)
print 'Random_generate', random_generator
print 'key: ', key

这正是我想要的,但generate() 中的randomStream 变量对生成函数的使用不正确。

#/usr/bin/python

from Crypto.PublicKey import RSA
from Crypto import Random

hwrngFile = open('/dev/hwrng', 'r')
randomStream = hwrngFile.read(512)
hwrngFile.close()

key = RSA.generate(4096, randomStream)
print key

【问题讨论】:

    标签: python encryption cryptography raspberry-pi encryption-asymmetric


    【解决方案1】:

    传入hwrngFile.read。在生成密钥之前不要关闭hwrngFile

    文档说:

    randfunc (callable) - 随机数生成函数;这应该 接受单个整数 N 并返回一串随机数据 N 字节 长。

    所以,hwrngFile.read 是一个函数,它接受一个整数,它返回那个字节数。太好了。

    您的代码应如下所示:

    with open('/dev/hwrng', 'r') as hwrgnFile:
        key = RSA.generate(4096, hwrngFile.read)
    

    【讨论】:

    • 我不熟悉 python,但在许多其他语言中,即使您尚未到达文件末尾,从文件/流中读取返回的字节数也可能少于请求的字节数。跨度>
    • @CodesInChaos:Python 不是其中之一。 open 返回一个缓冲的 IO 对象。除了在 ttys 上,它会读取直到达到请求的大小,或者错误或 EOF。在 ttys 上,缓冲的 IO 可以在不达到 EOF 的情况下返回短,所以我假设没有证据证明 Raspberry Pi 没有将其 RNG 标记为交互式。
    • 这个文件的内容应该是什么?我尝试将整数放入其中,但似乎不接受。请提出建议。
    • @Gauranga:/dev/hwrng 不是普通文件,它是硬件随机数发生器设备。如果您的系统上不存在它,那么您就不走运了,但是您可以寻找系统上可用的其他随机设备(例如/dev/urandom)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 2014-02-15
    相关资源
    最近更新 更多