Какое ограничение на количество данных, которые могут быть зашифрованы с помощью RSA? - PullRequest
16 голосов
/ 07 апреля 2011

Обычно рекомендуется использовать RSA для шифрования симметричного ключа, который затем используется для шифрования «полезной нагрузки».

Каков практический (или теоретический) предел объема данных, которые могут быть зашифрованы с помощью RSA (я использую 2048-битный размер ключа RSA).

В частности, мне интересно, безопасно ли шифровать открытый ключ RSA (256 байт) (другим) открытым ключом RSA? Я использую криптографические библиотеки Bouncy Castle на Java.

Ответы [ 4 ]

16 голосов
/ 07 апреля 2011

Для n -битного ключа RSA прямое шифрование (с PKCS # 1 заполнением "старого стиля") работает для произвольных двоичных сообщений вплоть до этажа (n / 8) -11 байт. Другими словами, для 1024-битного ключа RSA (128 байт) до 117 байт. С OAEP (дополнение нового стиля PKCS # 1) это немного меньше: OAEP использует хеш-функцию с выходной длиной h битов; это подразумевает ограничение размера floor (n / 8) -2 * ceil (h / 8) -2 : все еще для 1024-битного ключа RSA с SHA-256 в качестве хэш-функции ( h = 256 ), это означает двоичные сообщения до 60 байтов.

Нет проблем при шифровании ключа RSA с помощью другого ключа RSA (нет проблем при шифровании любой последовательности байтов с RSA, независимо от того, что эти байты представляют), но, конечно, "внешний" «Ключ RSA должен быть больше: при заполнении старого стиля для шифрования 256-байтового сообщения вам потребуется ключ RSA с модулем не менее 2136 бит.

Гибридные режимы (вы шифруете данные с помощью случайного симметричного ключа и шифруете этот симметричный ключ с помощью RSA) тем не менее рекомендуется в качестве общего случая, хотя бы потому, что они не имеют каких-либо практических ограничений размера, а также потому что они облегчают замену части RSA другим алгоритмом обмена ключами (например, Диффи-Хеллманом).

3 голосов
/ 07 апреля 2011

Предел более или менее бесконечен, но, как вы говорите сами, это не то, как следует использовать асимметричную криптографию.Методы, используемые для реализации асимметричной криптосистемы, на несколько порядков медленнее, чем методы для симметричной криптографии (такие как AES, TrippleDES, PRESENT, ...).Так зачем ты это делаешь?Используйте свою асимметричную криптографию, чтобы установить ключ (используя протокол создания безопасного ключа, не изобретайте его), а затем зашифруйте свои данные с помощью симметричного алгоритма, используя установленный ключ.

На соответствующем примечании: зачем вамзашифровать другим открытым ключом?Как следует из названия, он должен быть публичным.Злоумышленник не может ничего с этим поделать, если он возьмется за него.

[Редактировать] Одна вещь, которую вы обязательно должны проверить, это то, что функции, которые вы используете, реализуют заполнение (предпочтительно RSAES-OAEP).В противном случае ваш открытый ключ будет каждый раз шифроваться на один и тот же вывод, и, таким образом, злоумышленник, следящий за вашим сообщением, все равно может узнать, что вы что-то передаете, даже если он не может видеть, какой открытый ключ вы передаете.

2 голосов
/ 07 апреля 2011

(теоретический) предел бесконечен.

Для практического ограничения вам придется проводить тесты с вашей конкретной аппаратной / программной реализацией и сравнивать с вашими требованиями в отношении скорости.


Что касается безопасности, я бы сказал, да.Ваша личность (которую вы хотите скрыть) так же безопасна, как и личный ключ получателя.

0 голосов
/ 20 марта 2014

Через три года после того, как вы задали вопрос, я наткнулся на вашу публикацию, потому что мне просто нужно было реализовать что-то похожее. В этом случае вам понадобится режим шифрования, чтобы разбить сообщение на блоки размера ключа из-за максимальной длины сообщения. Вам также понадобится заполнение блоков для заполнения каждого блока сообщения (вместо заполнения сообщений обычно применяется что-то вроде DES, 3DES, AES). Не легко, но возможно. Вы должны убедиться, что каждый заполненный блок меньше максимально допустимого размера. Для заполнения блоков вы можете использовать, например, OAEP или PKCS_V1_5. В качестве режима шифрования вы можете использовать ECB (небезопасно, но работает) или что-то более сложное. (см. википедию и режимы шифрования).

если у вас есть хороший крипто-API, вы сможете установить режим шифрования и блокировку / заполнение сообщения и просто выбросить в него сообщение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...