Каков формат модуля открытого ключа RSA и экспоненты в .NET?

в коротком вопросе: как я могу заполнить параметры RSAP, если у меня есть следующие данные от третьей стороны ?:

Модуль: 123456

Exponet: 111

В длинном рассказе я использую следующий код:

RSACryptoServiceProvider RSAalg = новый RSACryptoServiceProvider (2048);

RSAParameters rsaPublic = RSAalg.ExportParameters (ложь);

тогда я могу получить модуль и показатель степени открытого ключа rsa в byte []. Чтобы записать эту информацию в формате asn.1

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

Я использую библиотеку asn.1 для преобразования byte [] в его формат bigInteger, но этот byte [] должен быть в таком формате, как {'0', '1', '2', '3', '4', ' 5 ',' 6 ',' 7 ',' 8 ',' 9 '} при условии, что он десятичный.

Но похоже, что rsaPublic.modulus и rsaPublic.exponent не находятся в этом формате, в байтах [] модуля и экспоненты много нецифровых цифр. Итак, каков формат rsaPublic.modulus и rsaPublic.exponent и как преобразовать их в byte [] с форматом вроде {'0', '1', '2', '3', '4', '5 ',' 6 ',' 7 ',' 8 ',' 9 '}?

Большое спасибо


rsa
person travellover    schedule 19.02.2010    source источник


Ответы (2)


Формат указан в справочнике ASN.1. Используемый формат называется кодировкой DER и для целых чисел. Для этих уродливых кодировок доступна ссылка. Вы уверены, что нет более простого способа получить эти значения в виде больших точек?

РЕДАКТИРОВАТЬ

Похоже, вы можете получить массивы byte [], получив объект RSAParameters через RSACryptoServiceProvider.ExportParameters(), а затем извлекая из него поля Exponent и Modulus.

person President James K. Polk    schedule 19.02.2010
comment
Я использую библиотеку asn.1. Он может легко обрабатывать открытый ключ в формате asn.1. Но проблема в том, что я не знаю, как преобразовать модуль .net в byte [] в разумный byte [], например {'0', '1', '2', '3', '4', '5' , '6', '7', '8', '9'}, модуль rsa в byte [] кажется бессмысленным, он закодирован в каком-то формате? - person travellover; 19.02.2010
comment
По сути, это целое число в виде байтового массива с прямым порядком байтов с некоторыми байтами заголовка впереди. Эквивалентно, это целое число, представленное в виде числа с основанием 256. Что вы хотите сделать с байтом [], тогда, может быть, я смогу дать лучшую подсказку? - person President James K. Polk; 19.02.2010
comment
Мне нужно, чтобы они сгенерировали открытый ключ RSA PKCS # 1 asn.1 по модулю и экспоненте RSA .net. Мой способ - использовать библиотеку asn.1. он может принимать модуль и показатель степени в байтах [] в основаниях 2, 18, 10 или 16, а затем генерировать собственное большое целое число, после чего он может генерировать формат открытого ключа PKCS # 1. поэтому сначала я хочу сгенерировать biginteger по модулю и экспоненте RSA .net. .net Модуль RSA и экспонента указаны в байтах [], но не все элементы в этих байтах [] являются цифрами ASCII, верно? Надеюсь, вы понимаете, о чем я говорю. - person travellover; 19.02.2010
comment
в коротком вопросе: Как я могу заполнить параметры RSAP, если у меня есть следующий ввод от третьей стороны ?: Модуль: 123456 Exponet: 111 - person travellover; 19.02.2010
comment
GregS, я думаю, что вы, возможно, правы, RASParameters.modulus и RASParameters.exponent выглядят как только число с прямым порядком байтов по основанию 256 в байте [], то есть RASParameters.modulus [0] является наиболее значимым битом, нет никакой информации . Я прав? - person travellover; 20.02.2010
comment
Правильно, модуль [0] - это старший байт, модуль [модуль- ›Длина - 1] - наименее значимый. - person President James K. Polk; 20.02.2010

Значения byte[] представляют собой байтовое представление Big Endian для больших целых чисел. Это почти, но не совсем то же самое, что и кодировка DER.

Для Modulus структура RSAParameters ожидает значение DER, но с удаленным необязательным знаковым заполнением 0x00 байтом. Для Exponent то же самое.

Если у вас есть структура закрытого ключа, то D должен иметь ту же длину byte[], что и Modulus (что может означать, что вам нужно добавить 0x00 значений). P, Q, DP, DQ и InverseQ являются обязательными, если указано D, и все они должны иметь ровно половину длины Modulus, что может потребовать удаления байтов заполнения DER или может потребовать их вставки.

person bartonjs    schedule 27.09.2016
comment
Если это правда, то мой ответ неправильный, и я удалю его. Как ты это понял? - person President James K. Polk; 28.09.2016
comment
@JamesKPolk Немного замучено, но github.com/dotnet/corefx/blob/. Если вы прочитаете соответствующий сертификат в декодере DER / ASN.1, вы увидите, что ожидаемые модуль и экспонента такие же, как значения DER без тега и длины (и байта заполнения для значения модуля). Хотя я немного обеспокоен, мой ответ подразумевает, что тег и длина должны присутствовать ... - person bartonjs; 28.09.2016