我在将.bin文件中的RSA512公钥加载到python时遇到了问题。这个问题主要源于我不知道密钥是以什么格式存储的。这是我得到的文件的唯一描述。
"key.bin -RSA512位公钥和指数的原始二进制字节。用于验证传入数据包的签名。“
我不知道这是否有帮助,但这是用python打印的.bin文件的字节。
9902c4a66b1ff76392919e7bbc35d51a5128b9da03e131b489d5ed01c1d075fc4c139a9952e9a3b040d984219a4aef0d421f6b8f9c79e1c3c35a218ecba54dc9010001
实际挑战的目标是构建一台udp服务器,用于验证传入数据包的数字签名和完整性。目前我使用的是Python2.7和密码库。文档可以在下面找到。https://cryptography.io/en/latest/hazmat/primitives/asymmetric/rsa/?highlight=rsa%20512
我已经尝试了下面的代码,但是对于前两种格式,我得到了相同的错误,对于第三种格式,我得到了略有不同的错误。
with open("key.bin", "rb") as key_file:
private_key = serialization.load_der_public_key(key_file.read(), backend=default_backend())
ValueError: Could not deserialize key data.
with open("key.bin", "rb") as key_file:
private_key = serialization.load_pem_public_key(key_file.read(), backend=default_backend())
ValueError: Could not deserialize key data.
with open("key.bin", "rb") as key_file:
private_key = serialization.load_ssh_public_key(key_file.read(), backend=default_backend())
ValueError: Key is not in the proper format or contains extra data.
此外,用于验证的散列算法是SHA256,但这可能无关紧要。
发布于 2019-04-15 17:32:52
您的密钥未采用已知标准进行编码。您需要提取模数和指数,然后用它们构建公钥。
模数定义RSA密钥大小,因此是512位或64字节作为无符号大端值。公共指数可以是任意大小,但通常很小。十六进制中最常用的指数值是010001,这是费马的第五个素数(也称为F4,从零开始的索引)。然而,更好的方法是简单地获取前64个字节,并假设其余的编码是公共指数。
因此,您可以使用RSAPublicNumbers
从模数n
和指数e
创建值。技巧是确保您创建的模数为正值,而不是负值。
假设data
是从文件中读取的二进制数据。然后您可以通过以下方式获取公钥。
如果以下方法不起作用,您可能希望使用'little'
而不是'big'
(高字节顺序是RSA默认值,但您永远不会知道)。然而,在你的例子中,小端的值可以被例如11整除,所以这不是一个可能的模数值(质数值应该接近密钥大小的一半,以保证安全)。
modsize = 512 // 8
modBytes = data[slice(0, modsize)]
mod = int.from_bytes(modBytes, byteorder='big')
expBytes = data[slice(modsize, None)]
exp = int.from_bytes(expBytes, byteorder='big')
pubkey = RSAPublicNumbers(exp, mod).public_key(default_backend())
请注意,from_bytes
仅在Python3.2中添加。RSAPublicNumbers
有点奇怪,因为它在模数之前接受指数参数。我见过的其他所有API都是在指数之前取模数。
https://stackoverflow.com/questions/55667111
复制相似问题