【发布时间】:2022-01-29 23:55:15
【问题描述】:
作为实现 RSA 的PKCS #1 v1.5 填充方案的一部分,我需要生成一个长度为 n 的八位字节字符串,其中包含伪随机生成的非零八位字节。 我正在寻找使用 Python 执行此操作的最佳方法。
这是我当前的实现的样子:
def nonzero_random_bytes(n: int) -> bytes:
values = [x.to_bytes(1, "big") for x in range(1, 256)]
seq = [secrets.choice(values) for _ in range(n)]
return b"".join(seq)
我查看了使用secrets.token_bytes(n) 生成字节字符串、过滤结果并生成非零值以回填字符串。我知道我也可以执行secrets.token_bytes(2 * n) 之类的操作、过滤和修剪结果,但这并不是一个优雅的解决方案。
我还研究了 PyCryptodome 和 python-pkcs1 是如何做到这一点的,但我认为一定有更好的方法(我在 pyca/cryptography 周围闲逛 但找不到他们是如何做到的 似乎他们使用 OpenSSL 绑定 - here's 我认为这是实现的)。
免责声明:我知道我不应该使用 PKCS1 v1.5,更不用说自己推出任何加密代码了。这纯粹是一个学术练习。 :)
【问题讨论】:
-
您从
secrets.token_bytes(2 * n)开始并修剪零的想法已经足够优雅了。secrets中没有接口可以更优雅地完成此操作。 -
n 有多大?它需要很快吗?
-
n 是 RSA 的填充长度,可能是 100-400 字节,具体取决于模数大小
标签: python random cryptography rsa