В прошлом при использовании 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, но, похоже, у него нет адекватной функции.
- Есть ли аналогичные функции, которые я пропустил в API шифрования Pythons?
- Возможно ли 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.Может ли здесь быть проблема с кодировкой?