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加密算法用的默认Provider
是org.bouncycastle.jce.provider.BouncyCastleProvider
。因此在服务端要想用私钥解密Android客户端用公钥加密的数据,在获得Cipher
对象的时候必须指定Provider
为org.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全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论