Могу ли я использовать запечатанные коробки pyNaCl с существующей парой ключей openssh?

Я пытаюсь использовать PyNacl для асимметричного шифрования (пары открытых и закрытых ключей ssh) для безопасной передачи данных.

Я использую существующую пару ключей, сгенерированную с помощью ssh-keygen -t ed25519 в формате openssh. (подробнее о моем коде ниже)

Вопрос в том, делал ли кто-нибудь это успешно раньше и как?

После извлечения того, что я достаточно уверен, являются ключи с библиотекой, называемой синтаксическим анализатором ключей openssh. (64 байта, 32 частных и 32 общедоступных)

"private_public": "b'2\\xfbO\\xab\\xd1\\\\Ie\\xa3\\x8b\\xc9\\x16\\xe8\\xd5\\xfcc\\xdc\\xa5k+H\\tQ\\xae\"\\x1c5+\\x89Q\\xe1p\\xf5\\x01\\xe4\\xfa\\xa1<[5\\xc4\\x07\\xc8\\xf5\\xd5\\xa7\\xbb\\xa3\\xefZm\\x99\\xd7<y\\x96\\xda\\x89x\\x04\\xcc\\x0e8p'"

Я использую открытый ключ для создания запечатанного ящика, который будет выполнять шифрование.

#load the public key
server_pubk = (OpenPublicKey.from_string(server_pubk_file_content))
#get exactly the key bytes
server_pubk = server_pubk.params.data['public']
#pass the key bytes to nacl
server_pubk = nacl.public.PublicKey(server_pubk)
#now we create the nacl SealedBox 
sealed_box = SealedBox(server_pubk)
#and encrypt a message
encrypted = sealed_box.encrypt(message)

насколько я могу судить, это работает так, как ожидалось. Моя проблема заключается в том, что я пытаюсь использовать закрытый ключ для создания запечатанного ящика, который будет расшифровывать сообщение.

unseal_box = SealedBox(server_privk)
plaintext = unseal_box.decrypt(encrypted) #does not work with the unhelpful error traceback below :

File "script.py", line 140, in <module>
unseal_box.decrypt(encrypted)
File "/usr/lib/python3.7/site-packages/nacl/public.py", line 361, in decrypt self._private_key,
File "/usr/lib/python3.7/site-packages/nacl/bindings/crypto_box.py", line 318, in crypto_box_seal_open
raising=exc.CryptoError)
File "/usr/lib/python3.7/site-packages/nacl/exceptions.py", line 81, in ensure
raise raising(*args)
nacl.exceptions.CryptoError: An error occurred trying to decrypt the message

Я немного поковырялся и заметил, что когда я делаю

server_privk = nacl.public.PrivateKey(server_privk)

для создания объекта PrivateKey, который будет использоваться SealedBox, nacl генерирует открытый ключ (атрибут server_privk.public_key), который не соответствует открытому ключу, который, как я знаю, является правильным и используется в первом SealedBox.

Я попытался переназначить server_privk.public_key тому же ключу, который я использовал для создания первого ящика, но это вызвало ту же проблему.

Мои текущие идеи:

  • Я что-то упускаю из виду, как работает формат openssh (может быть, я не получаю правильные байты закрытого ключа, может быть, мне нужно выполнить преобразование для них, может быть, библиотека синтаксического анализатора ключей openssh все портит).
  • Я не должен использовать openssh, а вместо этого преобразовать формат моего ключа и, возможно, использовать другую библиотеку для шифрования.

Любой ответ или идеи будут оценены :)

Рекомендации : Парсер openssh: https://github.com/scottcwang/openssh_key_parser pyNaCl: https://pynacl.readthedocs.io/en/latest/public/

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
796
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хорошо, вопрос решен, можно использовать pyNaCl с ed25519, вам просто нужно правильно преобразовать ключ. Нашел, как это сделать здесь: gist.github.com/R-VdP/b7ac0106a4fd395ee1c37bfe6f552a36

Немного раздражает, что документация неполная по этому поводу...

Другие вопросы по теме