Как работает JDK RSACore.priCrypt и что означает getBlindingRandomPair? - PullRequest
0 голосов
/ 11 апреля 2019

Я работаю над тем, как JDK реализует расшифровку RSA.Я нашел функцию «priCrypt» в RSACore.class, и ниже приведен код:

    private static byte[] priCrypt(byte[] var0, BigInteger var1, BigInteger var2) throws BadPaddingException {
        BigInteger var3 = parseMsg(var0, var1);
        RSACore.BlindingRandomPair var4 = null;
        var4 = getBlindingRandomPair((BigInteger)null, var2, var1);
        var3 = var3.multiply(var4.u).mod(var1);
        BigInteger var5 = var3.modPow(var2, var1);
        var5 = var5.multiply(var4.v).mod(var1);
        return toByteArray(var5, getByteLength(var1));
    }

var0 - это шифрованный_текст, var1 - это модуль, а var2 - это private_key.Мой вопрос, что означает «getBlindingRandomPair»?Я не могу понять его функцию.Если углубиться, кто-нибудь может объяснить, как реализована функция BigInteger.modPow?

1 Ответ

1 голос
/ 11 апреля 2019

Во-первых, это не-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, и игнорированию внутренних элементов.

...