Java / JCE: расшифровка "длинного" сообщения, зашифрованного с помощью RSA - PullRequest
2 голосов
/ 17 ноября 2008

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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 21 апреля 2012

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

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

1 голос
/ 20 июня 2012

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

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

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

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

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

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

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

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

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

...