M2Crypto - импортировать ключи из нестандартного файла?

У меня есть файл с показателем и модулем. Они не в формате pem, xml или der, а просто в значениях, записанных по умолчанию.

Как я могу сделать из них открытый ключ с помощью M2Crypto? У меня также есть закрытый ключ в том же формате. Мне удалось использовать код, который кто-то разместил здесь в Stackru, чтобы сгенерировать файл PEM с php, но это кажется крайне нелепым способом сделать это.

Это не единовременная вещь, мне нужно иметь возможность читать открытую экспоненту и модуль из файлов в этом формате, чтобы проверить подпись.

1 ответ

Решение

Большое спасибо Ларсу здесь: http://blog.oddbit.com/2011/05/09/signing-data-with-ssh-agent/

e это питон long общественного экспонента. n это питон long общественного модуля.

Код, который он разместил, был:

import M2Crypto
key = M2Crypto.RSA.new_pub_key((
    M2Crypto.m2.bn_to_mpi(M2Crypto.m2.hex_to_bn(hex(e)[2:])),
    M2Crypto.m2.bn_to_mpi(M2Crypto.m2.hex_to_bn(hex(n)[2:])),
    ))

hex сгенерирует шестнадцатеричную строку вида 0xA45Eтак что он просто захватывает все после 0x,

Я читаю ключ из файла, поэтому он у меня не такой длинный. Я закончил тем, что использовал:

import M2Crypto
from binascii import hexlify 
e = f.read(4)
n = f.read(0x80)
key = M2Crypto.RSA.new_pub_key((
    M2Crypto.m2.bn_to_mpi(M2Crypto.m2.hex_to_bn(hexlify(e))),
    M2Crypto.m2.bn_to_mpi(M2Crypto.m2.hex_to_bn(hexlify(n))),
    ))

Работал как шарм!

Принятый формат new_pub_keyсогласно документации, необходимо

Формат MPINT OpenSSL - 4-байтовый счетчик с прямым порядком байтов, за которым следует соответствующее количество бит

Я не уверен, что это опечатка, но для моего показателя (в шестнадцатеричном) 00010001 в конечном итоге 000003010001, Я думаю, что это количество байтов, а не количество бит. Они также раздели первый 0x00. Я не знаю, является ли это стандартным или потому что это был пустой байт.

редактировать: я думаю, что я немного лучше понимаю формат.

Если первый байт отрицательный, к началу добавляется нулевой байт. Если имеются начальные (в начале) нулевые байты, они удаляются, если только первый байт не станет отрицательным, и в этом случае остается только один нулевой байт.

Некоторые примеры:

Неформатировано: \ x23 \ x24 \ x25 \ x26 Отформатировано: \ x00 \ x00 \ x00 \ x04 \ x23 \ x24 \ x25 \ x26 Объяснение: Строка, оставленная как есть, и количество байтов, упакованных в формате Unformatted: \ x00 \ x23 \ x55 \ x35 Форматированный: \ x00 \ x00 \ x00 \ x03 \ x23 \ x55 \ x35 Объяснение: начальный нулевой байт удален, число байтов теперь 3 Неформатировано: \ x80 \ x43 \ x55 \ x27 Форматированный: \ x00 \ x00 \ x00 \ x05 \ x00 \ x80 \ x43 \ x55 \ x27 Объяснение: добавлен начальный нулевой байт, потому что \ x80 отрицательный Неформатированный: \ x00 \ xff \ x43 \ x23 Форматированный: \ x00 \ x00 \ x00 \ x04 \ x00 \ xff \ x43 \ x23 Объяснение: Ведущий ноль осталось байт, потому что \ xff отрицателен Неформатирован:
\x23\x53\66\x00 Отформатирован:
\x00\x00\x00\x04\x23\x53\66\x00 Объяснение: Завершающий нулевой байт слева в строке
Другие вопросы по тегам