Декодирование ключей EC в двоичный формат

#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
 

Что, вероятно, очень хрупкий способ добиться желаемого результата, но я не могу найти более питонического способа сделать это.