Расшифровка закрытых ключей Ed25519 с использованием библиотек Python без ssh-keygen -p

У меня есть закрытый ключ, пример создания пары ключей RSA:

ssh-keygen -t rsa -N 123456 -f /tmp/rsa

Я могу заменить вызов:

ssh-keygen -p -P 123456 -N "" -f /tmp/rsa

используя модуль криптографии Python:

from cryptography.hazmat.backends import default_backend
import cryptography.hazmat.primitives.serialization as crypto_serialization


priv_key = crypto_serialization.load_pem_private_key(open(key_path, "rb").read(),
                                                     passphrase.encode('utf-8'),
                                                     default_backend()
                                                     )
with open(key_path, "wb") as dest_pem:
    dest_pem.write(priv_key.private_bytes(crypto_serialization.Encoding.PEM,
                                          crypto_serialization.PrivateFormat.TraditionalOpenSSL,
                                          crypto_serialization.NoEncryption()
                                         )
                   )

Но когда я генерирую ключ с параметром -t ed25519, я получаю сообщение об ошибке:

  File "/usr/local/lib64/python3.6/site-packages/cryptography/hazmat/primitives/serialization/base.py", line 16, in load_pem_private_key
    return backend.load_pem_private_key(data, password)
  File "/usr/local/lib64/python3.6/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1089, in load_pem_private_key
    password,
  File "/usr/local/lib64/python3.6/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1315, in _load_key
    self._handle_key_loading_error()
  File "/usr/local/lib64/python3.6/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1373, in _handle_key_loading_error
    raise ValueError("Could not deserialize key data.")
ValueError: Could not deserialize key data.

Я загружаю закрытый ключ Ed25519 с помощью модуля python paramiko, но не могу сериализовать закрытые байты:

import paramiko
key_priv = paramiko.Ed25519Key.from_private_key_file('ed25519', password=b'123456')

person v1cont    schedule 15.02.2021    source источник
comment
Код, который, как вы утверждаете, работает для обработки закрытых ключей SSH RSA, у меня не работает. Вы звоните load_pem_private_key(), но это неправильный метод. модуль шифрования имеет другую функцию для закрытых ключей SSH, load_ssh_private_key(), который прекрасно работает как с ключами RSA, так и с ключами ed25519.   -  person President James K. Polk    schedule 15.02.2021
comment
Фактически, ваш код на самом деле не заменяет вызовы ssh-keygen, как вы утверждали. Код ssh-keygen -p -P... изменяет парольную фразу с 123456 на пустую парольную фразу. Новый файл закрытого ключа по-прежнему зашифрован (с пустой парольной фразой) и по-прежнему имеет формат openssh. Ваш код Python, с другой стороны, преобразует зашифрованный файл закрытого ключа в формате openssh в незашифрованный файл закрытого ключа в формате PKCS1. Совершенно разные.   -  person President James K. Polk    schedule 15.02.2021


Ответы (1)


Генерация пары ключей:

ssh-keygen -t ed25519 -N 123456 -f ed25519

Используя метод load_ssh_private_key, я пытаюсь расшифровать закрытый ключ:

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

priv_key = serialization.load_ssh_private_key(open('ed25519', 'rb').read(), b'123456', default_backend())

with open('ed25519_py', wb') as dest_key:
    dest_key.write(priv_key.private_bytes(serialization.Encoding.PEM,
                                          serialization.PrivateFormat.OpenSSH,
                                          serialization.NoEncryption()
                                         )
                   )

Ошибки не возникает, и я получаю незашифрованный файл закрытого ключа в формате openssh.

С другой стороны, с помощью инструмента ssk-keygen я меняю кодовую фразу файла закрытого ключа на пустую:

ssh-keygen -p -P 123456 -N "" -f ed25519

В результате у меня есть два расшифрованных ключа, которые не совпадают.

Как с помощью python получить ключ, который будет соответствовать результату вызова ssh-keygen?

person v1cont    schedule 19.02.2021