I have private pem key file, I am using that file for signing and encrypting the data. Signing works fine and I am also able to verify on another platform, but while encrypting the data, I am getting the following the 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)
Following is the code snippet to extract keys from 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);
And following is the code snippet to encrypt the data:
Cipher cipher = Cipher.getInstance("RSA/None/OAEPWithSHA1AndMGF1Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, mPubKey);
return cipher.doFinal("Hello World".getBytes()); // here is the problem
Any help to resolve the issue would be highly appreciated.
Regards, Yuvi
The problem was in retrieving the public key from private key, It should be like this:
RSAPublicKeySpec pubKeySpec = new java.security.spec.RSAPublicKeySpec(
privk.getModulus(), privk.getPublicExponent());
instead of :
RSAPublicKeySpec pubKeySpec = new java.security.spec.RSAPublicKeySpec(
privk.getPublicExponent(), privk.getModulus());
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With