Java / JCE: расшифровка «длинного» сообщения, зашифрованного с помощью RSA

У меня есть сообщение, содержащееся в байте [], зашифрованное с помощью «RSA / ECB / PKCS1Padding». Чтобы расшифровать его, я создаю Cipher c и запускаю его с помощью

c = Cipher.getInstance("RSA/ECB/PKCS1Padding");

До сих пор я расшифровывал только небольшие сообщения, используя метод doFinal (), возвращающий byte [] с расшифрованными байтами.

c.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptetBytes = c.doFinal(encryptedBytes);

Но в этом случае данные больше (примерно 500 байт), и метод doFinal () выдает исключение (javax.crypto.IllegalBlockSizeException: данные не должны быть длиннее 128 байт). Думаю, мне нужно использовать метод Обновить()-, но я не могу понять, как заставить его работать должным образом. Как это сделать?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
8 348
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

С помощью RSA вы можете зашифровать / расшифровать только блоки размером до длины вашего ключа минус длина заполнения. Если у вас есть данные длиннее, чем ваш ключ, возможно, они просто объединены в один массив, поэтому вам следует разделить их на фрагменты с размером вашего ключа (128 байтов предполагают ключ 1024 без заполнения, я не уверен, возможно ли это). Здесь не используется update ().

Просто вы должны знать, как был создан этот массив.

Вообще говоря, RSA не следует использовать для шифрования больших объемов данных, так как это занимает довольно много времени. Следует использовать для шифрования ключа симметричного шифра, например AES.

Взгляните сюда: https://www.owasp.org/index.php/Digital_Signature_Implementation_in_Java

Ответ принят как подходящий

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

Создайте новый ключ для симметричного шифра и зашифруйте с его помощью объемные данные. Затем зашифруйте ключ с помощью RSA. Отправьте симметрично зашифрованный шифрованный текст вместе с асимметрично зашифрованным ключом шифрования содержимого вашему получателю.

Как сказал Эриксон,

Шаги, которые вы должны предпринять для шифрования:

  1. Сгенерируйте пару ключей RSA (или получите открытый ключ из хранилища ключей)
  2. Создать симметричный ключ (AES)
  3. Шифровать данные с помощью ключа AES
  4. Зашифровать ключ AES с помощью открытого ключа RSA
  5. Сохраните (или отправьте человеку с закрытым ключом) зашифрованный ключ AES и зашифрованные данные AES.

Чтобы расшифровать:

  1. Получить закрытый ключ, связанный с той парой ключей, которая использовалась для шифрования
  2. Расшифровать ключ AES с помощью закрытого ключа
  3. Расшифровать данные с помощью ключа AES
  4. Использовать данные

Другие вопросы по теме