Android RSA与Java RSA加密不同标准产生问题的解决方法

最近做一个基于Android的客户端,客户端与Java服务器的通信需要实施安全方案。使用非对称密钥来对数据进行加密的,客户端用公钥加密,服务器用私钥解密。因此就用非对称密钥RSA算法来实施,在Android平台上与服务端初始化Cipher的时候都是使用以下这种方式:

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
int blockSize = cipher.getBlockSize();

在这种情况下,Android平台的客户端可以加密成功。而到了服务器却无法解密,却抛出了以下异常:

java.lang.Exception: Blocktype mismatch: 0

在网上搜索了很多资料,有很多解决Android RSA与Java加密标准不同产生的。但是大部分解决方法都是说把Android客户端和Java服务端上方法getInstance的参数写成统一形式,如:RSA/ECB/PKCS1Padding或者RSA/None/PKCS1Padding。但是当本人改成相同形式的时候,还是出现上面的相同的异常:

java.lang.Exception: Blocktype mismatch: 0

Android平台上RSA加密算法用的默认Providerorg.bouncycastle.jce.provider.BouncyCastleProvider。因此在服务端要想用私钥解密Android客户端用公钥加密的数据,在获得Cipher对象的时候必须指定Providerorg.bouncycastle.jce.provider.BouncyCastleProvider。也就是在服务器上使用与Android客户端RSA算法中相同的Provider

bouncycastle: http://www.bouncycastle.org/latest_releases.html

Android:

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

Java服务端:

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

至此,由Android RSA与Java RSA加密标准不同问题即可彻底解决。

版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/03/29/solutions-to-issues-arising-from-different-encryption-standards-between-android-rsa-and-java-rsa/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
Android RSA与Java RSA加密不同标准产生问题的解决方法
最近做一个基于Android的客户端,客户端与Java服务器的通信需要实施安全方案。使用非对称密钥来对数据进行加密的,客户端用公钥加密,服务器用私钥解密。因此……
<<上一篇
下一篇>>
文章目录
关闭
目 录