【问题标题】:Problem with random numbers for RSA.generate from PyCryptodome来自 PyCryptodome 的 RSA.generate 的随机数问题
【发布时间】:2021-10-02 14:51:01
【问题描述】:

我尝试使用 PyCryptodome 生成 RSA 密钥,并调用 os.urandom 以首先获取 som 随机数。一世 在生成 RSA 密钥之前,必须对随机数据进行一些统计测试和处理。我可以使用文件对象从文件中加载随机数。我真的在这个问题上摸不着头脑..

fx = open("rnd.dat", "rb")
key = RSA.generate(1024, fx.read)

下面的代码有效。

key = RSA.generate(1024, v1.readstd()) #Works! 

这里的代码没有。

key = RSA.generate(1024, v1.read())    #Not working....

我已经包含了来源。

from Crypto.PublicKey import RSA # PyCryptodome
from Crypto import Random
import os

class trng:
   def __init__(self, rngval): 
      self.rngval = rngval 
   def read(self):
      return self.rngval 
   def readstd(self):
      return Random.get_random_bytes

rngbuff=os.urandom(1024)
#....Here will go some processing
#..
#....end
v1 = trng(rngbuff)

key1 = RSA.generate(1024, v1.readstd()) #Works! 

fx = open("rnd.dat", "rb")  
key2 = RSA.generate(1024, fx.read) #Works! 

key3 = RSA.generate(1024, v1.read())    #Not working....

【问题讨论】:

    标签: python python-3.x pycryptodome python-cryptography


    【解决方案1】:

    您的代码中的问题是RSA.generaterandfunc 作为函数对象,而在您的代码中您调用函数本身导致self.rngval 作为参数传递给函数,该参数本身就是随机字节由os.urandom 返回,它没有读取方法,所以这将失败。 所以你需要调用函数作为

    key3 = RSA.generate(1024, v1.read)
    

    作为旁注,我不知道如何使用来自os.urandom 的返回值作为RSA.generate 的输入,因为RSA.generate randfunc 应该用作返回随机数的函数它一直在调用,直到它返回一个素数随机数。除非您确保此数字 (rngbuff) 是所需长度的有效质数。

    【讨论】:

    • 我不明白 RSA.generate 一直重复调用,直到找到素数。
    • @MatsStenfeldt 这样做是因为这些素数需要随机生成。但如果你确定rngbuffsize >= key bits 的质数,我想这可以工作,虽然我没有尝试过
    • 是的,我很确定。我正在读取由真随机数生成器生成的二进制文件,并根据 FIPS 140-2 在线测试对其进行检查。 Monobit、扑克和跑步。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 2019-11-30
    • 2012-04-13
    • 2011-05-21
    • 1970-01-01
    相关资源
    最近更新 更多