Я пытаюсь использовать 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: https://github.com/scottcwang/openssh_key_parser pyNaCl: https://pynacl.readthedocs.io/en/latest/public/
Хорошо, вопрос решен, можно использовать pyNaCl с ed25519, вам просто нужно правильно преобразовать ключ. Нашел, как это сделать здесь: gist.github.com/R-VdP/b7ac0106a4fd395ee1c37bfe6f552a36
Немного раздражает, что документация неполная по этому поводу...