Как правильно использовать OAEPEncoding для Bouncy Castle для RSA (Lightweight API) - PullRequest
5 голосов
/ 23 июня 2010

Я поиграл с реализацией RSA (Lightweight API) Bouncy Castle и понял основы. Глядя на их spec для реализации провайдера JCE, я заметил, что с RSA можно использовать разные схемы заполнения. Из того, что я понимаю, по умолчанию используется нулевое заполнение. Поэтому я начал изучать заполнение OAEP, особенно OAEPWithSHA512AndMGF1Padding. Поиск с помощью Google не очень помог, поэтому я начал копаться в исходном коде BC и нашел класс org.bouncycastle.jce.provider.JCERSACipher. Но просмотр initFromSpec быстро доставил мне головную боль ... В частности, я не понимаю, каковы последние два параметра, которые можно передать конструктору OAEPEncoding. Согласно API BC конструктор OAEPEncoding, который допускает четыре параметра, принимает Digest mgf1Hash и byte[] encodingParams в качестве двух последних аргументов. Это поставило меня в тупик, потому что я понятия не имею, как получить экземпляр алгоритма генерации маски, и при этом я не понимаю цели, стоящей за байтовым массивом, называемым encodingParams. Какими должны быть значения arg3 и arg4 в приведенном ниже коде?

RSABlindedEngine rsa = new RSABlindedEngine();
SHA512Diges sha512 = new SHA512Digest();
Digest arg3 = ???;
byte[] arg4 = ???;
AsymmetricBlockCipher cipher = new OAEPEncoding(rsa, sha512, arg3, arg4);

1 Ответ

7 голосов
/ 23 июня 2010

OAEP определяется PKCS # 1, раздел 7.1 .

Для OAEP требуются следующие параметры:

  • хеш-функция;
  • «функция генерации маски», которую можно рассматривать как хеш-функцию с неограниченной длиной вывода;
  • «метка» (произвольная последовательность байтов).

Существуеттолько одна определенная функция генерации маски, называемая MGF1, и эта функция построена поверх хеш-функции.Таким образом, ваша arg3 - это хеш-функция, которую MGF1 будет использовать.Это может быть та же самая хеш-функция, что и первой (я не уверен, что это может быть тот же самый экземпляр Digest в API Bouncy Castle; я говорю здесь математически).Это также может быть другая хеш-функция.

Метка может использоваться как своего рода различение между экземплярами (например, вы можете зашифровать данные с явной «целью», закодированной в метке).Это удобно в некоторых математических доказательствах, но сейчас PKCS # 1 рекомендует использовать пустую строку и покончить с этим.Для целей, описанных в PKCS # 1, пустая метка так же хороша, как и любая.

Процесс дешифрования должен знать эти параметры для работы.Обычно их кодируют в структуре, которая поставляется вместе с зашифрованным сообщением и гласит «это зашифровано с помощью RSA / OAEP»;Вот как это происходит в CMS .

В случае сомнений используйте ту же хеш-функцию, что и в первом параметре для MGF1, и используйте пустую метку.

...