Во-первых, это не-CRT версия примитива закрытого ключа RSA, который используется для расшифровки и подписи (и нет, подпись НЕ шифрует с помощью закрытого ключа, хотя часть его математически похоже, на crypto.SX и security.SX есть десятки Q). Версия без CRT неоправданно дорогая, и ее следует избегать, используя ключ формы CRT (RSAPrivateCrtKey
), и в этом случае RSACore
использует вместо него crtCrypt()
.
Также я надеюсь, что вы знаете, что шифрование / дешифрование и подписывание / проверка RSA - это НЕ просто примитивы x ^ e mod pq и y ^ d mod pq, которые сами по себе небезопасны; всегда нужно добавлять операцию заполнения ', а для подписи обычно необходимо добавить операцию безопасного хеширования (или дайджест); они также широко обсуждаются в области криптографии и безопасности.
Во-вторых, этот код, по-видимому, декомпилирован, поскольку помимо потери идентификаторов он пропускает постоянный if
тест и объединяет то, что является отдельным объявлением и присваиванием в источнике. Вместо этого я рекомендую использовать источник, поскольку он частично отвечает на некоторые ваши вопросы. (Плюс, по крайней мере, в соответствии со старым лицензированием Sun, декомпиляция была нарушением условий лицензии, хотя люди все равно делали это. Я не пересматривал новый разделенный OpenJDK против коммерческого лицензирования.) Весь исходный код OpenJDK доступен в https://hg.openjdk.java.net и я видел ссылки (но не знакомы) с несколькими другими хранилищами.
что означает "getBlindingRandomPair"?
Ослепление RSA [privatekey] - это метод предотвращения (или, по крайней мере, уменьшения) временных атак, который может позволить злоумышленнику обнаружить ваш закрытый ключ, тем самым разрушая вашу безопасность, нарушая фундаментальное требование криптографии с открытым ключом, что закрытый ключ должен храниться в тайне и не быть известным противнику. (Обратите внимание, что в криптографии используются другие виды ослепления, некоторые из которых включают RSA, поэтому не путайте их.) Он использует рандомизированную пару связанных значений экспоненты (называемых u и v), примененных до и после «реального» privatekey операция, а getRandomBlindingPair
означает получить пару случайных значений ослепления. В Википедии есть хорошее краткое описание , а источник (см. Выше) содержит подробную информацию о том, как именно это реализовано. Обратите внимание, что в некоторых случаях ошибки не так случайны, как предполагалось; это компромисс между наилучшей возможной безопасностью, и когда программы людей иногда терпят неудачу по причинам, которые большинство пользователей никогда не поймут или не смогут быстро исправить, а может, и вовсе нет, что сделает их довольно недовольными Java.
Может кто-нибудь объяснить, как реализована функция BigInteger.modPow?
Нет ответа в стеке. Эффективные (быстрые) алгоритмы и методы для вычислений с «bignums», и особенно с модульными bignums (как использует RSA), в последние десятилетия широко изучались математиками, в значительной степени благодаря их использованию в криптографии с открытым ключом, такой как RSA. Реализация modPow
использует эти методы; Начиная с Java 8 он использует методы из-за Карацубы, Тоом-Кука и Монтгомери, и я не удивлюсь, если более поздние версии (которые я пока не удосужился загрузить) добавляют больше. Если вы не хотите изучать (или уже знаете) хороший урок высшей математики, вам лучше всего доверять modPow
выполнению (простой) спецификации, подразумеваемой его именем и указанным в Javadoc, и игнорированию внутренних элементов.