#python #cryptography #ssh-keygen #ed25519
#python #криптография #ssh-keygen #ed25519
Вопрос:
У меня есть закрытый ключ, пример создания пары ключей 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')
Комментарии:
1. Код, который, как вы утверждаете, работает для обработки закрытых ключей SSH RSA, у меня не работает. Вы вызываете
load_pem_private_key()
, но это неправильный метод. Модуль криптографии имеет другую функцию для закрытых ключей SSH,load_ssh_private_key()
, которая отлично работает как для ключей RSA, так и для ключей ed25519.2. Фактически, ваш код на самом деле не заменяет
ssh-keygen
вызовы, как вы утверждали.ssh-keygen -p -P...
Код изменяет кодовую фразу с 123456 на пустую кодовую фразу. Новый файл закрытого ключа по-прежнему зашифрован (с пустой парольной фразой) и по-прежнему находится в формате openssh. С другой стороны, ваш код python преобразует зашифрованный файл закрытого ключа в формате openssh в незашифрованный файл закрытого ключа в формате PKCS1. Совершенно другой.
Ответ №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?