Размер ключа Microsoft RSA CSP - PullRequest
       37

Размер ключа Microsoft RSA CSP

2 голосов
/ 19 октября 2011

Из того, что я вижу, Microsoft CSP RSA всегда генерирует идентичные псевдо-простые числа длины волны. Таким образом, если размер ключа равен 1024, значения P и Q кажутся (?) Гарантированно равными 512 битам каждый? Кто-нибудь знает наверняка, так ли это на самом деле?

Я создаю модуль взаимодействия между моей собственной реализацией RSA и Microsoft. В моем случае я построил небольшую случайную дисперсию между значениями P & Q, поэтому для 1024-битного ключа я мог бы получить одно значение, равное 506 битам, а другое 518. На чисто экспериментальной основе, если я заблокирую дисперсию в 0 (т.е. значения P & Q равны по размеру) - все работает так, как должно, я, как только я задаю переменную размера, объект Microsoft RSA отвечает «Bad Data» в процессе импорта.

Я ищу подтверждение того, что Microsoft применяет ключи одинакового размера, поэтому, если у кого-то есть какая-либо информация, пожалуйста, напишите

Прежде чем кто-то сможет спросить, почему мне пришлось реализовать моего собственного провайдера RSA: CryptoAPI не очень хорошо работает в многопоточной среде, он блокирует хранилище ключей компьютера при вызовах CryptoServiceProvider; что означает «Файл не найден» (довольно загадочные) ошибки при доступе из нескольких потоков

Для тех, кто заботится, посмотрите здесь: http://blogs.msdn.com/b/alejacma/archive/2007/12/03/rsacryptoserviceprovider-fails-when-used-with-asp-net.aspx

Ответы [ 2 ]

1 голос
/ 20 октября 2011

Microsoft RSA CSP генерирует и использует закрытые ключи, которые он может экспортировать и импортировать в формате, описанном на этой странице , и выглядит следующим образом:

BLOBHEADER blobheader;
RSAPUBKEY rsapubkey;
BYTE modulus[rsapubkey.bitlen/8];
BYTE prime1[rsapubkey.bitlen/16];
BYTE prime2[rsapubkey.bitlen/16];
BYTE exponent1[rsapubkey.bitlen/16];
BYTE exponent2[rsapubkey.bitlen/16];
BYTE coefficient[rsapubkey.bitlen/16];
BYTE privateExponent[rsapubkey.bitlen/8];

Таким образом, закрытые ключиCSP может обрабатывать (и в частности генерировать) должен иметь следующие свойства:

  • Длина модуля в битах должна быть кратна 16.
  • Длина каждого простого множителядолжно быть не более половины длины модуля.
  • Частный показатель не должен быть длиннее модуля.
  • Частный показатель, уменьшенный по модулю p-1 (соотв. q-1 ) должно быть не больше половины модуля.

Технически существует бесконечно много возможных значений для частного показателя d и аналогично для exponent1 и exponent2, поскольку все, что имеет математическое значение, это значение d по модулю p-1 и q-1 ;было предложено принять немного более длинные частные экспоненты, если они в итоге получат меньший вес Хэмминга , потому что это приведет к некоторым преимуществам в производительности.Итог: формат, описанный выше, не позволит вам сделать это.

Другие характеристики, которые ключ должен быть должен быть приемлемым для кода Microsoft (но прямо не указано в описании выше):

  • Числовое значение первого простого числа ( p , он же prime1) должно быть больше, чем числовое значение второго простого числа ( q , он же prime2).
  • Публичный показатель (здесь закодированный в поле rsapubkey) должен соответствовать 32-разрядному целому числу (без знака).

Поэтому существует много пар ключей RSA, которыеноминально действителен в соответствии со стандартом RSA , но который не может быть обработан кодом Microsoft RSA CSP.Примечательным является последнее ограничение на размер общего показателя: это означает, что ограничение является более общим, чем просто CSP;если вы настроите сервер SSL, где открытый ключ сервера (в его сертификате) имеет открытый показатель, который не умещается в 32 бита, то Internet Explorer не сможет подключиться к нему.

Итак, на практике, если вы генерируете пары ключей RSA, вам необходимо убедиться, что они соответствуют приведенным выше правилам.Не беспокойтесь: насколько нам известно, эти правила не снижают безопасность.

0 голосов
/ 19 октября 2011

Моя собственная работа / эксперименты с выполнением Mono (управляемого) RSA и модульных тестов показывают, что реализация Microsoft требует определенного byte[] размера при импорте значений параметров RSA.

Это также общая проблема совместимости (есть некоторые вопросы SO по этому поводу), когда люди используют BigInteger для преобразования своих параметров, поскольку они часто немного меньше (например, на 1 байт), чем ожидают MS, и должен быть дополнен 0.

Так что я уверен, что вы можете дополнить свое меньшее значение, чтобы MS приняла его, но вы, вероятно, не сможете заставить его принять большее значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...