Подтвердить что ты не робот

Шифрование RSA, получение плохой длины

При вызове следующей функции:

byte[] bytes = rsa.Encrypt(System.Text.UTF8Encoding.UTF8.GetBytes(stringToEncrypt), true);

Теперь я получаю ошибку: плохая длина.

С меньшей строкой она работает, любые идеи о том, что проблема может быть передаваемой мной строкой, составляют менее 200 символов.

4b9b3361

Ответ 1

Шифрование RSA является только средним для небольших объемов данных, объем данных, которые вы можете зашифровать, зависит от размера используемого ключа, например, для 1024-битных ключей RSA и дополнения PKCS # 1 V1.5, вы можете зашифровать не более 117 байт, используя ключ RSA 2048, вы можете зашифровать 245 байт.

Там хорошая причина для этого, асимметричное шифрование является дорогостоящим. Если вы хотите зашифровать большие объемы данных, вы должны использовать симметричное шифрование. Но что, если вы хотите отказаться от отказа? Ну, что вы тогда делаете, это то, и другое. Вы создаете симметричный ключ и обмениваете его с помощью асимметричного шифрования, затем безопасно заменяете симметричный ключ для шифрования больших объемов данных. Это то, что SSL и WS-Secure находятся под обложками.

Ответ 2

Для будущих поисков, касающихся исключений длины RSA...

Вы можете вычислить максимальное количество байтов, которое может быть зашифровано с определенным размером ключа, со следующим:

((KeySize - 384)/8) + 37

Однако, если параметр оптимального асимметричного заполнения прошивки (OAEP) является истинным, как и в исходном сообщении, для вычисления максимальных байтов можно использовать следующее:

((KeySize - 384)/8) + 7

Размеры юридических ключей составляют от 384 до 16384 с размером пропуска 8.

Ответ 3

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

Для шифрования:

  • Создайте случайный ключ длины, необходимой для метода симметричного шифрования, такого как AES или Rijndael.

  • Симметрично шифруйте текст/данные с помощью AES/Rijndael, используя случайный ключ, сгенерированный на шаге 1.

  • Используя RSA, асимметрично шифруйте случайный ключ, сгенерированный на шаге 1.

Для расшифровки:

  • Сначала дешифруйте произвольный ключ, созданный AES/Rijndael, используя ваш частный ключ RSA.

  • Затем расшифруйте исходный текст/данные с помощью случайной клавиши с расширением RSA

Для демонстрации вы можете захотеть посмотреть следующий пример на С#:

http://www.technical-recipes.com/2013/using-rsa-to-encrypt-large-data-files-in-c/