Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RSA Encryption: Difference between Java and Android

I am using RSA to encrypt username and password on Android and decrypt them on server (tomcat 6, java 1.6). Android Encryption:

    PublicKey pubKey = readPublicKeyFromFile(mod, ex);     Cipher cipher = Cipher.getInstance("RSA");     cipher.init(Cipher.ENCRYPT_MODE, pubKey);     byte[] cipherData = cipher.doFinal(data);     return cipherData; 

Java Tomcat Decryption:

    PrivateKey pubKey = readPrivateKeyFromFile(mod, ex);     Cipher cipher = Cipher.getInstance("RSA");     cipher.init(Cipher.DECRYPT_MODE, pubKey);     byte[] cipherData = cipher.doFinal(data);     return cipherData; 

If I use the android part OUTSIDE android (Just in a main method) it works fine. But not inside my android (Emulator). On de server side I get the following error:

javax.crypto.BadPaddingException: Blocktype mismatch: 0     at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:311)     at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:255)     at com.sun.crypto.provider.RSACipher.a(DashoA13*..)     at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*..)     at javax.crypto.Cipher.doFinal(DashoA13*..) 

I keep the mod and ex as BigIntegers constants so I don't write them in to a file. I know that there are difference between java1.6 and java 1.5 encryption, so both are compiled with java 1.6.

Some debug info:

During debug in android I can see that pubKey contains modulus and exponent in hexadecimal. And if I debug in a main method (again the same code) I can see that pubKey contains modulus and exponent in decimal.

What am I doing wrong?

Thanks

like image 555
bsobat Avatar asked May 20 '11 08:05

bsobat


1 Answers

Im doing RSA Encrypt in Android 2.2+ and decrypt on a tomcat 6 java 1.6 server.

I was getting this exact problem, reading all over the place and in part thanks to @Femi 's answer I came across what I needed.

The solution was to use the folowing algorithm specification for the Cipher:

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 

This works doing encryption from both Android and BlackBerry smartphones. I know its been four months since the question was asked, but just in case someone else goes through this problem.

like image 198
blindstuff Avatar answered Sep 17 '22 00:09

blindstuff