#python #cryptography
Вопрос:
Я пытаюсь написать функцию python, которая будет принимать файл закрытого ключа в формате PEM и преобразовывать его в необработанное двоичное представление, аналогично тому, что делает следующая функция openssl:
openssl ec -in ec_private.pem -noout -text
read EC key
Private-Key: (256 bit)
priv:
7a:f6:73:2f:58:1d:00:5a:fc:f2:16:f6:38:5f:f6:
37:10:29:24:2c:c6:08:40:dd:7d:2a:7a:55:03:b7:
d2:1c
pub:
04:11:5b:3f:a3:9f:ae:41:b4:e3:2f:77:21:ca:72:
f8:c1:78:14:83:64:7d:ab:d5:14:f0:8e:66:12:8b:
d4:7f:ce:90:67:b9:0e:04:88:c9:c2:a9:f3:0f:5a:
26:6a:07:84:1d:6c:07:74:13:ba:07:e7:45:69:b9:
9d:4f:d3:ce:c6
ASN1 OID: prime256v1
NIST CURVE: P-256
Но с приватным ключом, отформатированным в более удобном для кода формате, например так
0x7A, 0xF6...
Я пытался использовать библиотеку pyOpenSSL, библиотеку криптографии и библиотеки PyNaCl без какого-либо успеха.
Есть ли способ сделать это, или мне нужно написать оболочку вокруг функции командной строки, которая выполняет это форматирование за меня?
Спасибо!
Комментарии:
1. Кроме того, если кто-нибудь знает правильную терминологию для «двоичного ключа», который я пытаюсь сгенерировать, это было бы очень полезно. Это лучшее описание, которое я мог придумать.
2. Я бы не назвал это «необработанным двоичным форматом», я бы назвал это шестнадцатеричным форматом.
Ответ №1:
В итоге я просто сделал оболочку вокруг системной библиотеки openssl:
import os
def convert_key(keyfile):
stream = os.popen('openssl ec -in {} -noout -text'.format(keyfile))
output = stream.read().strip()
keylines = output.splitlines()
keystring = keylines[2].strip() keylines[3].strip() keylines[4].strip()
formatted_key = "0x" keystring.replace(":", ", 0x")
return formatted_key
Что, вероятно, очень хрупкий способ добиться желаемого результата, но я не могу найти более питонического способа сделать это.