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




С помощью RSA вы можете зашифровать / расшифровать только блоки размером до длины вашего ключа минус длина заполнения. Если у вас есть данные длиннее, чем ваш ключ, возможно, они просто объединены в один массив, поэтому вам следует разделить их на фрагменты с размером вашего ключа (128 байтов предполагают ключ 1024 без заполнения, я не уверен, возможно ли это). Здесь не используется update ().
Просто вы должны знать, как был создан этот массив.
Вообще говоря, RSA не следует использовать для шифрования больших объемов данных, так как это занимает довольно много времени. Следует использовать для шифрования ключа симметричного шифра, например AES.
Взгляните сюда: https://www.owasp.org/index.php/Digital_Signature_Implementation_in_Java
Я считаю, что использование шифрования RSA для чего угодно, кроме передачи ключей, является злоупотреблением.
Создайте новый ключ для симметричного шифра и зашифруйте с его помощью объемные данные. Затем зашифруйте ключ с помощью RSA. Отправьте симметрично зашифрованный шифрованный текст вместе с асимметрично зашифрованным ключом шифрования содержимого вашему получателю.
Как сказал Эриксон,
Шаги, которые вы должны предпринять для шифрования:
Чтобы расшифровать: