首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将.bin文件中的RSA512公钥和指数加载到Python中

如何将.bin文件中的RSA512公钥和指数加载到Python中
EN

Stack Overflow用户
提问于 2019-04-13 23:33:54
回答 1查看 1.3K关注 0票数 1

我在将.bin文件中的RSA512公钥加载到python时遇到了问题。这个问题主要源于我不知道密钥是以什么格式存储的。这是我得到的文件的唯一描述。

"key.bin -RSA512位公钥和指数的原始二进制字节。用于验证传入数据包的签名。“

我不知道这是否有帮助,但这是用python打印的.bin文件的字节。

9902c4a66b1ff76392919e7bbc35d51a5128b9da03e131b489d5ed01c1d075fc4c139a9952e9a3b040d984219a4aef0d421f6b8f9c79e1c3c35a218ecba54dc9010001

实际挑战的目标是构建一台udp服务器,用于验证传入数据包的数字签名和完整性。目前我使用的是Python2.7和密码库。文档可以在下面找到。https://cryptography.io/en/latest/hazmat/primitives/asymmetric/rsa/?highlight=rsa%20512

我已经尝试了下面的代码,但是对于前两种格式,我得到了相同的错误,对于第三种格式,我得到了略有不同的错误。

代码语言:javascript
运行
复制
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,但这可能无关紧要。

EN

回答 1

Stack Overflow用户

发布于 2019-04-15 17:32:52

您的密钥未采用已知标准进行编码。您需要提取模数和指数,然后用它们构建公钥。

模数定义RSA密钥大小,因此是512位或64字节作为无符号大端值。公共指数可以是任意大小,但通常很小。十六进制中最常用的指数值是010001,这是费马的第五个素数(也称为F4,从零开始的索引)。然而,更好的方法是简单地获取前64个字节,并假设其余的编码是公共指数。

因此,您可以使用RSAPublicNumbers从模数n和指数e创建值。技巧是确保您创建的模数为正值,而不是负值。

假设data是从文件中读取的二进制数据。然后您可以通过以下方式获取公钥。

如果以下方法不起作用,您可能希望使用'little'而不是'big' (高字节顺序是RSA默认值,但您永远不会知道)。然而,在你的例子中,小端的值可以被例如11整除,所以这不是一个可能的模数值(质数值应该接近密钥大小的一半,以保证安全)。

代码语言:javascript
运行
复制
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都是在指数之前取模数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55667111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档