Obtener el error java.lang.ArrayIndexOutOfBoundsException: demasiados datos para el bloque RSA

Tengo el archivo privado de la llave del pem, yo estoy utilizando ese archivo para firmar y cifrar los datos. Firmar funciona bien y también puedo verificar en otra plataforma, pero al cifrar los datos, estoy recibiendo el siguiente error:

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) 

A continuación se muestra el fragmento de código para extraer claves de un archivo privado:

 // 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); 

Y el siguiente es el fragmento de código para cifrar los datos:

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

Cualquier ayuda para resolver el problema sería muy apreciada.

Recuerdos, Yuvi

El problema estaba en recuperar la llave pública de la llave privada, debe ser como esto:

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

en lugar de :

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

Ese mensaje de error se produce cuando el búfer de entrada es mayor que el tamaño del bloque de entrada del cifrado. Parece improbable que ese sería el caso con una cadena de entrada que corta, por lo que el primer lugar para mirar es la línea anterior. Creo que la cifra no se está inicializando correctamente, o mejor dicho, no de la manera que usted espera, ya que no está lanzando una excepción. Empezaría haciendo algunas impresiones de depuración del objeto cifrado después de la llamada init() .

Maldita sea, tuve el mismo error pero la razón era que estaba leyendo el material para descifrar usando StringBuilder en lugar de ByteArrayOutputStream (Instancia de StringBuilder utiliza el método append que anexa la línea y daña la fuente original para el descifrado).

: /

  • Compartir y almacenar RSA - clave pública en el servidor java y viceversa
  • RSA y AES Descifrar y cifrar el problema
  • Descifrado RSA en Android - iPhone
  • Diferentes claves públicas RSA generadas en Android
  • Obteniendo 1 byte extra en el módulo RSA Key ya veces para exponentes también
  • Cómo cargar adbkey.pub con Python RSA
  • Mensaje firmado usando OpenSSL; No se puede verificar con Android Java
  • Diferencia de cifrado asimétrica - Android vs Java
  • Determinar el certificado de firma de un APK
  • Práctica recomendada para descifrar archivos grandes con menos memoria
  • Java: ¿Cómo puedo generar PrivateKey de una cadena?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.