«Не удалось десериализовать данные ключа» при сериализации ключа publi c - PullRequest
1 голос
/ 06 августа 2020

Я пытаюсь загрузить ключ publi c с помощью модуля «криптография», и похоже, что я копирую точно такой код (размещенный здесь ) с небольшими изменениями :

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes, serialization

def encrypt(message, publicKeyPath):
  with open(publicKeyPath, 'rb') as keyFile:
    privateKey = serialization.load_pem_private_key(
      keyFile.read(),
      password=None,
      backend=default_backend()
    )

  print(privateKey)

message = 'This message will be encrypted'

publicKeyPath = '/(path to key)/My First Key_public.pem'

encryptedMessage = encrypt(message, publicKeyPath)

Однако я все время получаю сообщение об ошибке «Не удалось десериализовать данные ключа». Вот полная трассировка:

Traceback (most recent call last):
  File "/Users/max.s.haberman/Documents/Code/Experiments/Encryption/encryption2.py", line 23, in <module>
    encryptedMessage = encrypt(message, publicKeyPath)
  File "/Users/max.s.haberman/Documents/Code/Experiments/Encryption/encryption2.py", line 9, in encrypt
    backend=default_backend()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/cryptography/hazmat/primitives/serialization/base.py", line 16, in load_pem_private_key
    return backend.load_pem_private_key(data, password)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1186, in load_pem_private_key
    password,
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1411, in _load_key
    self._handle_key_loading_error()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1465, in _handle_key_loading_error
    raise ValueError("Could not deserialize key data.")
ValueError: Could not deserialize key data.

Вот ключ publi c, который я использую, который хорошо работал в других местах:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkaqpgfRRZa0H8A7v3ebJ
z+lM+j0Jdw2xftUoIDmGWkrQ0vJXnkCwP/zcALI/mgAlMtr4KDSrE0n7/+1u1uB+
DuhdjuGhu5EAAdA+N1yMOCRNfYRJFpAtQLO2qu6h6wU1HmVLIK87kyTAoVcn+HIX
4uMiQbNG7PH2Cv+VaQvA91I/tTcSkY/ZrGTYcFHa0k+sSGxqQDW7C7mu5RKssxAa
QCSnAUOjV+j1lUMvWYr8qs5yI4wRsFH6sP6m2/Ksrj1i3+DSOWJOy/WQs1e1CBcA
cVfyM+dflllneNkF6rnB0n2wIE4TeRatzy6AlSjQ7FohSkAfOMW6GwszVhEFSAu2
4QIDAQAB
-----END PUBLIC KEY-----

Я что-то упустил? Что мне еще нужно сделать? Похоже, что у других пользователей StackOverflow была эта проблема, но я не думаю, что их ситуации применимы ко мне, поскольку мой ключ не включает пробелы , рабочий publi c ключ уже был создал , эт c. Любая помощь приветствуется. Заранее спасибо!

1 Ответ

2 голосов
/ 06 августа 2020

Связанный код относится к закрытому ключу. Но для шифрования вам понадобится ключ publi c (для дешифрования требуется ключ private ):

publicKey = serialization.load_pem_public_key(
    keyFile.read(),
    backend=default_backend()
)
    

Опубликованный ключ вроде в порядке . Это закодированный PEM ключ publi c в формате PKCS8.

Пример (еще отсутствующего) шифрования можно найти здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...