В RSA Lib, которую я реализовал сам, как мне преобразовать 2 части ключа RSA в b64? - PullRequest
1 голос
/ 28 апреля 2020

Я использую C для небольшой библиотеки Crypto, которую я реализую. У меня есть n (= p * q) и e (> 1, совмещенное число n). Как мне преобразовать эти 2 числа в один ключ?

1 Ответ

1 голос
/ 28 апреля 2020

Спецификации для преобразования ключа в структуру приведены в спецификации PKCS # 1 . В основном это просто структура ASN.1:

RSAPublicKey ::= SEQUENCE {
    modulus           INTEGER,  -- n
    publicExponent    INTEGER   -- e
}

Затем она кодируется с использованием DER, отличительных правил кодирования для ASN.1. Это двоичная кодировка, которая, конечно, может быть преобразована в базу 64. Обычно, однако, она не просто преобразуется в базу 64, она также будет разбита на несколько строк и обернута строкой заголовка и строкой нижнего колонтитула, что дает вам PEM. В этом случае заголовок должен указывать RSA PUBLIC KEY.

. Если вам нужна более высокая совместимость, двоичной структуре PKCS # 1, в свою очередь, предшествует описательная оболочка, используемая в сертификатах X.509 (которые используются в веб-браузерах, среди прочих). Эта структура называется SubjectPublicKeyInfo, а оболочка PEM будет указывать тип PUBLIC KEY - то есть без RSA. То, что это является ключом RSA publi c, уже указывается информацией в двоичной структуре.

Но я полагаю, что вы хотели бы начать с относительно простой структуры PKCS # 1 и затем подробно остановимся на этом. Для получения дополнительной информации попробуйте старый Руководство для неспециалистов по подмножеству ASN.1, BER и DER .


Мне нравятся стандарты, но вы также можете использовать двухбайтовый указатель длины для модуля и экспоненты c, а затем объединить их, как в:

<l_mod> <modulus> <l_exp> <pubexp>

Тогда вам все равно придется подумать о конкретном c способе кодирования целочисленных значений. Я бы использовал unsigned big endian, чтобы размер ключа ( в байтах вместо битов ) был значением l_mod. Тогда вы можете base64 выше. Он нигде не стандартизирован, но его гораздо проще понять и запрограммировать.

...