PyCryptodome的RSA.generate传入自定义随机数失效问题咨询
问题原因
RSA.generate()的第二个入参要求为可调用对象:该对象需要接收一个整数参数(表示所需随机字节的长度),调用后返回对应长度的随机字节数据。- 你使用的
v1.read()写法是直接执行了read方法,返回的是提前生成的rngbuff字节串,不是可调用对象,完全不符合参数要求,因此运行失败。 - 即使你去掉括号改为传入
v1.read,当前定义的read方法没有设计接收长度参数,RSA.generate内部调用时传入长度参数会触发参数数量不匹配的报错。
解决方法
首先调整trng类的read方法,使其适配参数要求,支持按请求长度返回随机数据:
class trng: def __init__(self, rngval): self.rngval = rngval self.read_offset = 0 # 新增偏移量标记当前读取位置 def read(self, n): # 新增参数n接收要求的随机字节长度 # 按请求长度返回对应片段,你也可以根据需求自定义不够长时的补充逻辑 result = self.rngval[self.read_offset : self.read_offset + n] self.read_offset += n return result def readstd(self): return Random.get_random_bytes
修改后调用时传入read方法本身,不要加括号执行即可:
key3 = RSA.generate(1024, v1.read)
注意事项
提前生成的随机数缓冲区长度需要足够支撑RSA密钥生成的消耗,1024位RSA密钥生成通常需要数百字节随机数,你当前生成的1024字节缓冲区可以满足需求,如果使用更长的密钥位数,建议对应扩大缓冲区长度,或者在read方法中补充随机数不足时的兜底生成逻辑。
内容的提问来源于stack exchange,提问作者Mats Stenfeldt
相关产品推荐
相关产品推荐

