Ключ экспорта Python Cryptography в DER - PullRequest
0 голосов
/ 02 февраля 2019

В прошлом при использовании 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.Может ли здесь быть проблема с кодировкой?

1 Ответ

0 голосов
/ 06 февраля 2019

Чтобы ответить на мой вопрос (который был решен с помощью, предоставленной в комментариях, еще раз спасибо).

Чтобы добиться того, что я смог сделать с 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"
...