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

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

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

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

1
java.lang.Exception: Blocktype mismatch: 0

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

1
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:

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

Java服务端:

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

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

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2021 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :