Рейтинг:2

Какой смысл хранить R^2 с открытым ключом?

флаг in

Я думаю, что успешно реконструировал открытый ключ Samsung RSA. здесь. Однако открытый ключ в основном состоит из модуля, но он также содержит 32-битное целое число. -1 / n[0] мод 2^32, то есть инверсия первого 32-битного слова модуля, а также Р^2 (возможно, мод?).

Кто-нибудь может объяснить, почему эти значения включены в открытый ключ RSA? Что могут сделать эти ценности? Сначала я подумал о возможной защите от атак по сторонним каналам, но это не имеет смысла для открытого ключа.


Узнал немного больше информации в исходном коде:

/* монтгомери c[] += a * b[] / R % mod */
static void montMulAdd(const RSAPublicKey *key,
                       uint32_t* с,
                       константа uint32_t а,
                       константа uint32_t* б) {
    uint64_t A = (uint64_t)a * b[0] + c[0];
    uint32_t d0 = (uint32_t)A * key->n0inv; // <--- ЗДЕСЬ
    uint64_t B = (uint64_t)d0 * key->n[0] + (uint32_t)A;
    инт я;


    for (я = 1; я < ключ-> len; ++ я) {
        A = (A >> 32) + (uint64_t)a * b[i] + c[i];
        B = (B >> 32) + (uint64_t)d0 * key->n[i] + (uint32_t)A;
        с[i - 1] = (uint32_t)B;
    }


    А = (А >> 32) + (В >> 32);


    с[i - 1] = (uint32_t)А;


    если (А >> 32) {
        subM (ключ, с);
    }
}

и

/* Публичное возведение в степень на месте.
** Ввод и вывод массива байтов с обратным порядком байтов в inout.
*/
static void modpow3 (const RSAPublicKey *key,
                    uint8_t* вход) {
    uint32_t [RSANUMWORDS];
    uint32_t aR[RSANUMWORDS];
    uint32_t aaR[RSANUMWORDS];
    uint32_t *ааа = ар; /* Повторное использование местоположения. */
    инт я;


    /* Преобразование массива байтов с прямым порядком байтов в массив слов с прямым порядком байтов. */
    for (я = 0; я < ключ-> len; ++ я) {
        uint32_t тмп =
            (inout[((key->len - 1 - i) * 4) + 0] << 24) |
            (inout[((key->len - 1 - i) * 4) + 1] << 16) |
            (inout[((key->len - 1 - i) * 4) + 2] << 8) |
            (inout[((key->len - 1 - i) * 4) + 3] << 0);
        а[я] = tmp;
    }


    montMul(клавиша, aR, a, клавиша->rr); /* aR = a * RR / R mod M */ // <-- ЗДЕСЬ
    montMul(ключ, aaR, aR, aR); /* aaR = aR * aR / R mod M */
    montMul(ключ, ааа, ааР, а); /* ааа = ааR * а/R по модулю М */


    /* Убедитесь, что aaa < mod; aaa не более чем в 1 раз больше по модулю. */
    если (geM(ключ, ааа)) {
        subM(ключ, ааа);
    }


    /* Преобразование в массив байтов с прямым порядком байтов */
    for (i = key->len - 1; i >= 0; --i) {
        uint32_t tmp = ааа[я];
        *inout++ = tmp >> 24;
        *inout++ = tmp >> 16;
        *inout++ = tmp >> 8;
        *inout++ = tmp >> 0;
    }
}

Итак, я предполагаю, что оба используются для ускорения модульного возведения в степень при использовании общедоступного показателя степени 3? Если да, то может ли кто-нибудь указать используемые алгоритмы?

Maarten Bodewes avatar
флаг in
Итак, я нашел старый пост Томаса Порнина, нашего дружелюбного медведя [на SO] (https://stackoverflow.com/a/5377967/589259). Итак, я предполагаю, что `R ^ 2` ускоряет `возведение в квадрат и умножение` для реализации модульного возведения в степень и что инверсия `n[0]` помогает ускорить модульное сложение Монтгомери (используемое для умножения) внутри? Означает ли это, что R^2 является сигнатурой в квадрате по модулю N?
Рейтинг:2
флаг pe

Простейшая возможность заключается в том, что эти значения включены, чтобы максимально упростить реализацию. А именно, единственный примитив, необходимый для возведения в степень, — это умножение Монтгомери.

Основным механизмом умножения Монтгомери является модульная редукция, которая по существу состоит из метода деления Хензеля, сохраняющего только остаток. Если у вас нечетный модуль $n < 2^b$, и некоторое значение $ х < п ^ 2 $, вычисление сокращения Монтгомери $$ \frac{x + n\left(xn' \bmod 2^b\right)}{2^b}\,, $$ с $n' = -n^{-1} \bmod 2^b$ (вышеприведенная реализация использует усеченное значение $n' = -n^{-1} \bmod 2^{32}$, что достаточно для простых квадратичных реализаций). Это гарантирует, что а) результат $x2^{-b} \bmod n$, б) деление на $2^б$ тривиально, поскольку $x + n\влево(xn' \bmod 2^b\вправо)$ является кратным $2^б$ по дизайну, и c) результат уменьшен по размеру не более чем $2n$.

При составлении нескольких операций по модулю $n$, например, в возведении в степень, удобно помещать операнды в «форму Монтгомери», то есть $x \mapsto x2^b \bmod n$. Это связано с тем, что умножение Монтгомери будет умножать операнды и уменьшать их, используя описанный выше прием. Так, $$ \text{MontMul}(x2^b, y2^b) = \frac{x2^b\cdot y2^b}{2^b} \bmod n = xy2^b \bmod n\,, $$ тем самым сохраняя форму Монтгомери для следующей операции.

Есть несколько способов преобразовать аргументы в форму Монтгомери. Один из них заключается в вычислении $x\cdot 2^b \bmod n$ вручную, используя длинное деление. Это прискорбно, потому что для выполнения указанного деления потребуется дополнительный сложный код. Альтернативой является использование самого умножения Монтгомери для вычисления $$ \text{MontMul}(x, 2^{2b}) = \frac{x\cdot 2^{2b}}{2^b} \bmod n = x2^b \bmod n\,. $$ Однако для этого требуется предварительное вычисление $2^{2b} \bmod n$ где-то, что и делает приведенный выше формат открытого ключа.

Чтобы преобразовать значение $x2^b \bmod n$ вернуться к нормальной форме, достаточно умножить его на $1$ с помощью умножения Монтгомери. Или, альтернативно, как это делает эта реализация, умножить $х^22^б$ к $х$ чтобы получить $\frac{x^32^b}{2^b} \bmod n = x^3 \bmod n$.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.