在过去使用PyCrypto时,我能够执行以下操作来生成RSA公钥的指纹:
rsa_cipher = PKCS1_v1_5.new(RSA.importKey(pub_rsa_key))
hashlib.sha1(rsa_cipher._key.exportKey("DER")).hexdigest()
如果没有PyCrypto,我如何实现同样的目标?
编辑
我在pub_rsa_key
中提供的是.perm
文件的内容,即:
-----BEGIN PUBLIC KEY-----
MII...AB
-----END PUBLIC KEY-----
PyCrypto被认为是不安全的,不再进行维护,所以我切换到Python的Cryptography,但它似乎没有足够的功能。
- 在Pythons Cryptography 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"
其中
# 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"
这是从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"