Intereting Posts
<Ваше приложение> имеет проблемы с сервисами Google Play. При использовании GoogleApiClient он всегда запускается onConnectionFailed NumberFormatException для действительного числа String Службы Google Play – пользовательское уведомление / приветствие Предоставьте разрешение на использование андроида для подключения к «непроверенному серверу» Веб-браузер Progressbar, такой как браузер Chrome Как удалить медленный конец анимации с помощью ObjectAnimator? Opengl ES 1.1 / Android – Фигура текстурирования на квадрат 2011 года Android SDK не распознает отладочное устройство Каковы основы работы с событиями ввода пользователей в Android? Метод InputTextLayout setError () в Android не работает Подсказка EditText исчезает с гравитацией Структура данных, используемая для сообщений SMS в Android Как получить точное точное местоположение в андроиде без подключения к Интернету? Как использовать скрипт для запроса базы данных sqlite для Android Как создать набор атрибутов из style.xml?

Получение ошибки java.lang.ArrayIndexOutOfBoundsException: слишком много данных для блока RSA

У меня есть частный файл ключа pem, я использую этот файл для подписания и шифрования данных. Подписание работает нормально, и я также могу проверить на другой платформе, но при шифровании данных я получаю следующее сообщение об ошибке:

04-04 09:55:51.821: E/AndroidRuntime(2725): FATAL EXCEPTION: Thread-102 04-04 09:55:51.821: E/AndroidRuntime(2725): java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block 04-04 09:55:51.821: E/AndroidRuntime(2725): at com.android.org.bouncycastle.jce.provider.JCERSACipher.engineDoFinal(JCERSACipher.java:457) 04-04 09:55:51.821: E/AndroidRuntime(2725): at javax.crypto.Cipher.doFinal(Cipher.java:1106) 04-04 09:55:51.821: E/AndroidRuntime(2725): at com.example.testsigning.MainActivity.rsaEncrypt(MainActivity.java:185) 04-04 09:55:51.821: E/AndroidRuntime(2725): at com.example.testsigning.MainActivity$1.run(MainActivity.java:51) 04-04 09:55:51.821: E/AndroidRuntime(2725): at java.lang.Thread.run(Thread.java:856) 

Ниже приведен фрагмент кода для извлечения ключей из частного файла:

 // Read the file into string String privKeyPEM = readFile("/mnt/sdcard/rsa_key"); privKeyPEM = privKeyPEM.replace("-----BEGIN RSA PRIVATE KEY-----", ""); privKeyPEM = privKeyPEM.replace("-----END RSA PRIVATE KEY-----", ""); // Base64 decode the data byte[] encoded = Base64.decode(privKeyPEM, Base64.DEFAULT); // PKCS8 decode the encoded RSA private key PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded); KeyFactory kf = KeyFactory.getInstance("RSA"); mPrivKey = kf.generatePrivate(keySpec); RSAPrivateCrtKey privk = (RSAPrivateCrtKey) mPrivKey; RSAPublicKeySpec pubKeySpec = new java.security.spec.RSAPublicKeySpec( privk.getPublicExponent(), privk.getModulus()); mPubKey = kf.generatePublic(pubKeySpec); 

Следующим является фрагмент кода для шифрования данных:

 Cipher cipher = Cipher.getInstance("RSA/None/OAEPWithSHA1AndMGF1Padding", "BC"); cipher.init(Cipher.ENCRYPT_MODE, mPubKey); return cipher.doFinal("Hello World".getBytes()); // here is the problem 

Любая помощь для решения проблемы будет высоко оценена.

С уважением, Юви

Solutions Collecting From Web of "Получение ошибки java.lang.ArrayIndexOutOfBoundsException: слишком много данных для блока RSA"

Проблема заключалась в извлечении открытого ключа из закрытого ключа. Это должно быть так:

 RSAPublicKeySpec pubKeySpec = new java.security.spec.RSAPublicKeySpec( privk.getModulus(), privk.getPublicExponent()); 

вместо :

 RSAPublicKeySpec pubKeySpec = new java.security.spec.RSAPublicKeySpec( privk.getPublicExponent(), privk.getModulus()); 

Это сообщение об ошибке возникает, когда входной буфер больше размера входного блока шифрования. Кажется маловероятным, что это будет иметь место с короткой входной строкой, поэтому первое, что нужно посмотреть, это предыдущая строка. Я думаю, что шифр не инициализируется должным образом, или, скорее, не так, как вы ожидаете, поскольку он не выбрасывает исключение. Я начну с выполнения отладочных отпечатков объекта шифрования после вызова init() .

Черт, у меня была такая же ошибка, но причина в том, что я читал материал для дешифрования с помощью StringBuilder вместо ByteArrayOutputStream (экземпляр StringBuilder использует метод append, который добавляет строку и повреждает исходный источник для дешифрования).

: /