过去使用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的密码学,但是它似乎没有足够的功能。
  • 是否有我在Pythons密码API中错过的类似功能?
  • PyCryptoDome是否可能是PyCrypto的有值(value)(稳定且安全)的替代品,以用于实现此功能?
  • 如果以上都不是,则可以通过自写函数以DER格式导出该 key 吗?

  • 任何文档或搜索词来执行导出将是有帮助的。

    编辑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"
    

    关于Python密码术导出 key 到DER,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54495255/

    10-10 14:50
    查看更多