Выходной размер шифрования RSA

Каков размер вывода шифрования RSA при использовании 2048-битного ключа и pkcs1padding.

Всегда ли 256 байтов не зависят от размера ввода?

Как я могу рассчитать его для других размеров ключей?


person hyda    schedule 06.09.2014    source источник
comment
Вы заметили, что 256*8=2048?   -  person Perseids    schedule 06.09.2014
comment
@Персеиды. да, но я не уверен, что вывод всегда 256 байт. это?   -  person hyda    schedule 06.09.2014
comment
Из RSA_size: RSA_size() возвращает RSA размер модуля в байтах. Его можно использовать для определения объема памяти, который должен быть выделен для значения, зашифрованного с помощью RSA. (размер сообщения зависит от размера модуля).   -  person jww    schedule 03.07.2017


Ответы (3)


Да, это так.

output-size должен всегда равняться размеру Modulus (части ключа), поэтому:

2048 bit Modulus -> 2048 bit output
1024 bit Modulus -> 1024 bit output
...

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

Таким образом, чтобы гарантировать, что выход равен 2048 bit, даже если вход для шифрования равен, скажем, 7,
всегда должно применяться заполнение!

person i_turo    schedule 06.09.2014
comment
Ситуация немного сложнее. Будучи несколько педантичным, я мог бы утверждать, что если модуль мал для своего битового размера (скажем, он начинается со 100 бит), то у вас есть хорошие шансы получить зашифрованный текст, который на самом деле немного короче, чем модуль. Но, что более важно, не большие входные значения, а звуковая схема заполнения делают RSA безопасным. Например, атака Джона Хастада работает с любой детерминированной схемой заполнения, если вы используйте малую степень (например, 3). - person Perseids; 06.09.2014
comment
Причина того, что результат совпадает с модулем, заключается в том, что он явно соответствует размеру модуля. Разве это не, потому что применяется отступ. Даже когда применяется заполнение, модульное возведение в степень приведет к случайно выглядящему значению между нулем и модулем, и это значение может быть закодировано в меньшем количестве байтов, чем модуль< /б>. См. мой ответ, почему результат по-прежнему имеет тот же размер, что и модуль. Этот ответ не объясняет, почему результат имеет тот же размер, что и модуль в байтах. - person Maarten Bodewes; 13.03.2018

Выходные данные (в виде целого числа) RSAEP (примитив шифрования RSA): всегда между 0 и n:

  1. Если представитель сообщения m не находится между 0 и n-1, выведите представитель сообщения вне диапазона и остановитесь.

  2. Пусть c = m^e mod n.

  3. Выход в.

Конечно, c — это число. Поэтому вам нужно преобразовать его в байты, чтобы его можно было использовать. Единственное, что известно о c, это то, что оно меньше n при большом значении m. Возможно, c на несколько байт меньше, даже если m велико.


Вы упомянули PKCS1Padding, который является частью RSAES-PKCS1-V1_5-ENCRYPT. Заполнение гарантирует, что m всегда будет большим и рандомизированным; требования к шифрованию RSA, чтобы быть безопасным.

Вы обнаружите, что там указана кодировка c:

...

Шаг 4: Преобразование представителя зашифрованного текста c в зашифрованный текст C длиной k октетов: C = I2OSP (в, к)

...

где k — размер модуля в октетах (байтах).

Так что да, ответ всегда k, размер модуля в байтах. Просто потому, что так требует стандарт. Это значение, закодированное как число без знака с обратным порядком байтов, с префиксом из необходимого количества нулевых байтов.


Примечания:

  • размер модуля определяет размер ключа. Таким образом, результат шифрования RSA такой же, как и размер ключа: ceil(keySize / 8.0) с использованием чисел с плавающей запятой или (keySize + 8 - 1) / 8 с использованием целых чисел.

  • RSA с заполнением OAEP использует тот же метод, поэтому ответ правильный и для OAEP (и для большинства других, менее известных схем, таких как RSA-KEM).

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

person Maarten Bodewes    schedule 06.09.2014
comment
Если вы не уверены, прочитайте стандарт! Зачастую они гораздо более читабельны, чем люди ожидают. - person Maarten Bodewes; 06.09.2014
comment
Чтобы получить окончательный размер буфера с помощью двоичной логики: needed = (size + (keySize >> 3) - 1) & ~((keySize >> 3) - 1)) - person Geoffrey; 16.06.2020
comment
Зачем вам скрывать это вычисление, используя сдвиги? Почему бы не позволить компилятору разобраться? Читаемость, несомненно, более важна для такого рода расчетов. - person Maarten Bodewes; 16.06.2020
comment
Зачем вам вычислять его, используя числа с плавающей запятой, которые по определению неточны? Это просто для демонстрации другого метода, вот и все :). - person Geoffrey; 16.06.2020

Выходной размер простого RSA (с использованием некоторой схемы заполнения, но без гибридного шифрования) всегда является ключом. размер. Причина в том, что для некоторого открытого ключа n результатом является некоторое целое число c с 0<=c<n. Есть много вводных для RSA, например. http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-045j-automata-computability-and-complexity-spring-2011/lecture-notes/MIT6_045JS11_rsa.pdfrel=

person Perseids    schedule 06.09.2014