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

StackOverflow https://stackoverflow.com/questions/295436

  •  08-07-2019
  •  | 
  •  

Вопрос

У меня есть сообщение, содержащееся в байте [], зашифрованное с помощью "RSA / ECB / PKCS1Padding". Чтобы расшифровать его, я создаю шифр 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 байт) , Я думаю, мне нужно использовать метод update () , но я не могу понять, как заставить его работать должным образом. Как это сделать?

Это было полезно?

Решение

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

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

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

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

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

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

Посмотрите здесь: https://www.owasp.org/index.php/Digital_Signature_Implementation_in_Java

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

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

<Ол>
  • Создать пару ключей RSA (или получить открытый ключ из хранилища ключей)
  • Создать симметричный ключ (AES)
  • Шифровать данные с помощью ключа AES
  • Зашифруйте ключ AES с помощью открытого ключа RSA
  • Храните (или отправляйте лицу с закрытым ключом) зашифрованный ключ AES и зашифрованные данные AES
  • Для расшифровки:

    <Ол>
  • Получить закрытый ключ, связанный с этой парой ключей, используемой для шифрования
  • Расшифровать ключ AES с помощью закрытого ключа
  • Расшифровать данные с помощью ключа AES
  • Использовать данные
  • Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top