Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.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
Python加密将密钥导出到DER_Python_Cryptography_Rsa_Pycrypto_Python Cryptography - Fatal编程技术网

Python加密将密钥导出到DER

Python加密将密钥导出到DER,python,cryptography,rsa,pycrypto,python-cryptography,Python,Cryptography,Rsa,Pycrypto,Python Cryptography,在过去使用PyCrypto时,我能够执行以下操作来生成RSA公钥的指纹: rsa\u cipher=PKCS1\u v1\u 5.new(rsa.importKey(pub\u rsa\u key)) hashlib.sha1(rsa\u cipher.\u key.exportKey(“DER”)).hexdigest() 没有PyCrypto,我如何实现同样的功能 编辑 我在pub\u rsa\u key中提供的是.perm文件的内容,即: -----BEGIN PUBLIC KEY--

在过去使用PyCrypto时,我能够执行以下操作来生成RSA公钥的指纹:

rsa\u cipher=PKCS1\u v1\u 5.new(rsa.importKey(pub\u rsa\u key))
hashlib.sha1(rsa\u cipher.\u key.exportKey(“DER”)).hexdigest()
没有PyCrypto,我如何实现同样的功能


编辑

我在
pub\u rsa\u key
中提供的是
.perm
文件的内容,即:

-----BEGIN PUBLIC KEY-----
MII...AB
-----END PUBLIC KEY-----
PyCrypto被认为是不安全的,不再维护,所以我切换到Python的加密技术,但它似乎没有足够的功能

  • Pythons加密API中是否有我遗漏的类似功能
  • PyCryptoDome是否有可能成为PyCrypto的一个有价值(稳定且安全)的替代品来实现此功能
  • 如果上述任何一项都无法通过自编函数以DER格式导出该密钥
任何用于执行导出的文档或搜索条件都会有所帮助


编辑2
马丁·博德维斯(Maarten Bodewes)的评论(谢谢)把我带到了一个我一直在寻找的地方。但DER出口的结果不同:

# Python 3.7 using Cryptography
from cryptography.hazmat.primitives import serialization

with open('pub_key.perm', 'rb') as key_file: 
    public_key = serialization.load_pem_public_key(key_file.read(), backend=default_backend())

pub_der = public_key.public_bytes(encoding=serialization.Encoding.DER, format=serialization.PublicFormat.PKCS1)

print(sha1(pub_der).hexdigest())
# gives "d291c142648b7........c2f4676f4213203c4bd"
在哪里

这是一项从Py2到Py3的工作——请注意,这两个示例使用不同的Python版本。编码可能是这里的一个问题吗?

来回答我的问题(通过评论中提供的帮助解决了这个问题,再次感谢)

要实现我使用PyCrypto所能做到的:

# Python 2.7 using PyCrypto
from Crypto.Cipher import PKCS1_v1_5
from Crypto.PublicKey import RSA

with open('pub_key.perm', 'r') as key_file:
    public_key = RSA.importKey(key_file.read())

pub_der = public_key.exportKey('DER')  # this assumes PKCS1 by default per the __doc__

print(sha1(pub_der).hexdigest())
# gives "bb070664079f5........64c97fcadbad847cce9"
使用加密技术,可以执行以下操作:

# Python 3.7 using Cryptography
from cryptography.hazmat.primitives import serialization

with open('pub_key.perm', 'rb') as key_file: 
    public_key = serialization.load_pem_public_key(key_file.read(), backend=default_backend())

pub_der = public_key.public_bytes(
    encoding=serialization.Encoding.DER,
    format=serialization.PublicFormat.SubjectPublicKeyInfo,
)

print(sha1(pub_der).hexdigest())
# gives "bb070664079f5........64c97fcadbad847cce9"

谢谢,我希望我现在提供了足够(或至少一些)有价值的信息。好的,酷,这是一个很好的问题,因为它现在已经格式化了。我执行了一些格式化,将实际问题捆绑在一起,诸如此类。如果您不同意,请随意展开。对第一句尖刻的话表示抱歉;我们确实觉得没有什么特别的原因,我们必须复制一个现有的免费库。我想说的是,然后将它序列化到内存中的DER(就在下面),这样你就可以散列密钥了。它使用OpenSSL作为后端,PEM是OpenSSL的主要格式(因此不可能出现兼容性问题)。呃,您当然会使用:)您的公钥具有SubjectPublicKeyInfo格式或X509格式,而不是PKCS#1格式;实际上,PKCS#1表单在SubjectPublicKeyInfo中。PEM在PKCS#1格式的破折号之间使用“BEGIN RSA PUBLIC KEY”(因为PKSC#1没有指定算法,而SubjectPublicKeyInfo指定算法)。
# Python 3.7 using Cryptography
from cryptography.hazmat.primitives import serialization

with open('pub_key.perm', 'rb') as key_file: 
    public_key = serialization.load_pem_public_key(key_file.read(), backend=default_backend())

pub_der = public_key.public_bytes(
    encoding=serialization.Encoding.DER,
    format=serialization.PublicFormat.SubjectPublicKeyInfo,
)

print(sha1(pub_der).hexdigest())
# gives "bb070664079f5........64c97fcadbad847cce9"