gpt4 book ai didi

Python 3 - 从 X509 证书中提取公钥并用它加密

转载 作者:太空狗 更新时间:2023-10-30 03:02:02 27 4
gpt4 key购买 nike

由于 M2Crypto 库不适用于 Python 3,我正在寻找一种方法来读取 X509 证书,从中提取公钥并将其用于 RSA 加密。

我目前有以下两个功能:

from ssl import PEM_cert_to_DER_cert  # standard library
from Crypto.Util import asn1 # http://pycrypto.org
from OpenSSL.crypto import * # https://pythonhosted.org/pyOpenSSL/

def extract_publickey_1(certstr):
""" from http://stackoverflow.com/questions/12911373 """
der = PEM_cert_to_DER_cert(certstr)
cert = asn1.DerSequence()
cert.decode(der)
tbs = asn1.DerSequence()
tbs.decode(cert[0])
return tbs[6]

def extract_publickey_2(certstr):
return dump_privatekey(FILETYPE_ASN1,
load_certificate(FILETYPE_PEM, certstr).get_pubkey())

第一个函数为某些证书引发了一​​个IndexError,特别是那些不是从命令行 OpenSSL 而是一些加密库生成的证书(python 和 c# 库是测试。)它适用于命令行 OpenSSL 生成的证书。

我已经检查了第二个函数的输出,它与第一个函数并不相同,但输出的最后 266 个字节是等效的:

extract_publickey_1(certstr)[-266:] == extract_publickey_2(certstr)[-266:]

返回 True

我的问题是,这是怎么回事?有解决办法吗?

最佳答案

首先,您必须了解,因为 X.509 证书以 ASN.1 格式编码,它表示为各种值的深度和任意嵌套集合——并且嵌套样式和值数据类型可能即使在 DER 模式下也是任意的。因此,期望一个固定位置和固定形式的字段是非常天真的,即。 e.无需进一步嵌套且具有严格的数据类型(尤其是涉及文本字符串时);更不用说使用“魔法常量”总是是个坏主意。这就是为什么您应该尽可能使用专门的函数,例如get_pubkey() 而不是像您对 那样尝试自己解析复杂的文档 asn1 类。

其次,您必须了解,由于 X.509 规范与算法无关,因此没有“RSA 模数”、“RSA 公共(public)指数”等特定字段。相反,只有一个通用的“公钥”字段具有一组嵌套的子字段——指定算法 OID 及其数字属性。例如,RSA 公钥有两个属性:模数 n 和加密指数 e;此外,您的 extract_publickey_2() 函数添加了一个始终为零的属性,我不知道它代表什么。 您的 RSA 实现很可能需要数字参数而不是字节数组或复杂的 ASN.1 值,这就是为什么您可能需要使用 asn1.DerSequence.decode() 提取它们 或更特定于 RSA 的函数。

关于Python 3 - 从 X509 证书中提取公钥并用它加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23495789/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com