I have a private pem key file, I use this file to sign and encrypt data. Signing works fine, and I can also check on a different platform, but when encrypting the data, I get the following 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)
The following is a snippet of code for extracting keys from a private file:
// 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);
The following is a code snippet for data encryption:
Cipher cipher = Cipher.getInstance("RSA/None/OAEPWithSHA1AndMGF1Padding", "BC"); cipher.init(Cipher.ENCRYPT_MODE, mPubKey); return cipher.doFinal("Hello World".getBytes());
Any help to solve the problem would be greatly appreciated.
Regards, Yuvi
source share