Ключ экспорта Python Cryptography в DER
В прошлом при использовании 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
Комментарии Мартена Бодьюса (спасибо) привели меня в место, которое, похоже, было тем, что я искал. Но результаты экспорта МЭД отличаются:
# 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. Может ли здесь быть проблема с кодировкой?
1 ответ
Чтобы ответить на мой вопрос (который был решен с помощью, предоставленной в комментариях, еще раз спасибо).
Чтобы добиться того, что я смог сделать с 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"