Getting error java.lang.ArrayIndexOutOfBoundsExcep

2019-03-28 09:11发布

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

3条回答
淡お忘
2楼-- · 2019-03-28 09:25

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());
查看更多
贼婆χ
3楼-- · 2019-03-28 09:40

That error message occurs when the input buffer is larger than the cipher's input block size. It seems unlikely that that would be the case with an input string that short, so the first place to look is the previous line. I think the cipher is not getting initialized properly, or rather, not in the way you expect since it's not throwing an exception. I would start by doing some debugging prints of the cipher object after the init() call.

查看更多
Bombasti
4楼-- · 2019-03-28 09:44

Damn I had same error but the reason was I was reading material to decrypt using StringBuilder instead of ByteArrayOutputStream (Instance of StringBuilder uses append method wich appends line and damages original source for decryption).

: /

查看更多
登录 后发表回答