RSAencryption:Java和Android之间的区别

我正在使用RSA在Android上encryption用户名和密码,并在服务器(tomcat 6,java 1.6)上解密它们。 Androidencryption:

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解密:

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

如果我使用android部分的OUTSIDE android(只是在一个主要的方法),它工作正常。 但不是我的android(模拟器)。 在服务器端我得到以下错误:

 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*..) 

我把mod和ex保持为BigIntegers常量,所以我不把它们写入到一个文件中。 我知道java1.6和java 1.5encryption之间有区别,所以两者都是用java 1.6编译的。

一些debugging信息:

在Android的debugging期间,我可以看到pubKey包含hex模数和指数。 如果我在一个主要的方法debugging(再次相同的代码),我可以看到pubKey包含模数和十进制指数。

我究竟做错了什么?

谢谢

Solutions Collecting From Web of "RSAencryption:Java和Android之间的区别"

我做Android 2.2+ RSAencryption和解密在tomcat 6 Java 1.6服务器。

我得到了这个确切的问题,读遍了各地,部分得益于@Femi的回答,我遇到了我需要的东西。

解决方法是使用以下密码algorithm规范:

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

这可以从Android和BlackBerry智能手机进行encryption。 我知道这个问题已经过了四个月,但以防其他人经历这个问题。

我build议你使用特定的密码初始化:作为一个例子,

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

将在两个工作。 由于在桌面JVM和Android JVM之间默认密码初始化填充看起来不同,所以发生了exception( BadPaddingException )。

首先,看起来你正在使用公钥初始化两个密码。 encryption使用公钥,解密使用私钥。 我希望这只是一个错字。

我在RSAencryption方面也遇到了很多麻烦,很多都是反复试验。 我build议你尝试另一个提供者。 我设法使用BouncyCastle来实现RSA。

 Cipher wrapper = Cipher.getInstance("RSA", "BC"); wrapper.init(Cipher.ENCRYPT_MODE, publicKey); encryptedData= wrapper.doFinal(unencryptedData); 

虽然,我生成了我自己的密钥对,因为这是一个会话encryption。

 kpg = KeyPairGenerator.getInstance("RSA"); kpg.initialize(1024); KeyPair kp = kpg.genKeyPair(); publicKey = kp.getPublic(); privateKey = kp.getPrivate();