Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3-从X509证书中提取公钥并使用它进行加密_Python_Ssl_Encryption_Cryptography_Openssl - Fatal编程技术网

Python3-从X509证书中提取公钥并使用它进行加密

Python3-从X509证书中提取公钥并使用它进行加密,python,ssl,encryption,cryptography,openssl,Python,Ssl,Encryption,Cryptography,Openssl,由于M2Crypto库不适用于Python3,因此我正在寻找一种读取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/

由于M2Crypto库不适用于Python3,因此我正在寻找一种读取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())
第一个函数为某些证书,特别是那些不是从命令行OpenSSL生成的证书,而是一些加密库(测试了python和c#libs)生成的证书,生成一个
索引器

我已经检查了第二个函数的输出,它与第一个函数不同,但输出的最后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公共指数”等没有特定字段。相反,只有一个通用“公钥”字段具有嵌套的子字段集—指定算法OID及其数值属性。例如,RSA公钥有两个属性:模数
n
和加密指数
e
;此外,您的
extract\u publickey\u 2()
函数会预先添加一个始终为零的属性,我不知道它代表什么您的RSA实现很可能需要数字参数,而不是字节数组或复杂的ASN.1值,这就是为什么您可能需要使用
asn1.DerSequence.decode()提取它们的原因
或更特定于RSA的函数。

如果您发布的证书中有一个会产生错误,另一个不会产生错误,则调查您的问题可能会更容易;“可能用最小的键大小。”安东萨姆索诺夫说。没有。我已经澄清了问题的最后一部分。我也是。。。有点澄清了。:-)