Код: Выделить всё
import os
from stat import S_IRUSR
from stat import S_IWUSR
from cryptography.hazmat.primitives.asymmetric import ed25519
from cryptography.hazmat.primitives.serialization import BestAvailableEncryption
from cryptography.hazmat.primitives.serialization import Encoding
from cryptography.hazmat.primitives.serialization import PrivateFormat
if __name__ == "__main__":
private=ed25519.Ed25519PrivateKey.generate()
secret="123456".encode()
a="./ed-pkcs8"
with open(a, "wb") as f:
contents=private.private_bytes(
Encoding.PEM,
PrivateFormat.PKCS8, # OpenSSH works. RSA works with both.
BestAvailableEncryption(secret))
f.write(contents)
os.chmod(a, S_IRUSR | S_IWUSR)
Код: Выделить всё
python keytest.py
ssh-keygen -y -f ed-pkcs8
Я ожидал, что содержимое ключа появиться (в незашифрованном виде). Вместо этого я получаю сообщение об ошибке «Загрузить ключ «ed-pkcs8»: для расшифровки закрытого ключа указана неверная парольная фраза».
3. Альтернативы, которые работают
- Замена PrivateFormat.PKCS8 на PrivateFormat.OpenSSH. Но опять же, конечно, генерируется другой формат.
- Генерируется RSA (вместо ED25519).
- Если я перезагружаю файл в Сам модуль шифрования Python использует метод load_pem_private_key (вместо использования ssh-keygen).
Возможно, я что-то не так понимаю, но опять же, я не знаком с OpenSSH, поэтому не могу комментировать.
(Версии )
- Darwin Laptop-david.local 24.1.0 Darwin Kernel Version 24.1.0: четверг, 10 октября, 21:03:15 по тихоокеанскому летнему времени 2024 г.; root:xnu-11215.41.3~2/RELEASE_ARM64_T6000 Arm64
- Python 3.13.0 [ cffi==1.17.1, cryptography==43.0.3, pycparser==2.22, bcrypt== 4.2.0 ]
- OpenSSH_9.8p1, LibreSSL 3.3.6 (несмотря на ограничения)
Подробнее здесь: https://stackoverflow.com/questions/791 ... -module-in