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

最近做一个基于android的客户端,客户端与Java服务器 (MyEclipse自带的Tomcat服务器)的通信需要实施安全方案。而本人是使用非对称密钥来对数据进行加密的,客户端用公钥加密,服务器用私钥解 密。因此本人就用非对称密钥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”

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

“java.lang.Exception: Blocktype mismatch: 0”。

最后终于找到了一种最根本的方法,就是在服务器上使用与Android客户端RSA算法中相同的Provider。android平台上RSA加密算法用的默认Provider是“org.bouncycastle.jce.provider.BouncyCastleProvider”。因此在服务端要想用私钥解密android客户端用公钥加密的数据,在获得Cipher对象的时候必须指定Provider为“org.bouncycastle.jce.provider.BouncyCastleProvider”。因此解决方法如下:

首先是环境配置:

第一步:

首先需要获得“BouncyCastleProvider”的jar包。

然后把下载好了的jar(bcprov-jdk15-143.jar)放在目录:“F:\software_installed\Genuitec\Common\binary\com.sun.java.jdk.win32.x86_1.6.0.013\jre\lib”下。这里目录中粗体、斜体部分为本人MyEclipse的安装目录。

第二步:

需要在服务器上的目录:“F:\software_installed\Genuitec\Common\binary\com.sun.java.jdk.win32.x86_1.6.0.013\jre\lib\security”下(目录中黑色粗体为本人MyEclipse安全目录),修改java.security文件,找到以下内容:

security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=com.sun.net.ssl.internal.ssl.Provider
security.provider.4=com.sun.crypto.provider.SunJCE
security.provider.5=sun.security.jgss.SunProvider
security.provider.6=com.sun.security.sasl.Provider
security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.8=sun.security.smartcardio.SunPCSC
security.provider.9=sun.security.mscapi.SunMSCAPI

 

紧跟上面内容加上下面这句话:

security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider

这里的数字“10”是在数字“9”的基础上递增的。

最后重启MyEclipse,重启动MyEclipse后,如果在library中没有发现该“bcprov-jdk15-143.jar”jar,那需要手工导入改jar包到你之前建好的工程中。

其次代码:

最后在android客户端和MyEclipse工程中获取Cipher对象的代码如下:

android:

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

MyEclipse工程里:

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

值得注意的有两点:

1、代码中黑体和粗体要一致

2、代码中紫色部分为必须指定的Provider。

至此,由Android RSA与JavaRSA加密标准不同产生可以彻底解决了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android RSA 和 Web RSA 都是使用RSA算法进行数据加密和解密的方式,只是在不同的平台上实现。下面分别对两者进行简要说明。 Android RSA: 在Android系统中,可以通过Java标准库`java.security`来使用RSA算法。在Android中使用RSA算法,首先需要生成RSA密钥对,包括公钥和私钥。然后可以使用公钥对数据进行加密,私钥对数据进行解密。在Android平台上,可以使用RSA算法对用户敏感信息进行加密,例如用户登录密码等,以保证信息的安全性。 Web RSA: 在Web开发中,RSA算法也广泛应用于数据的加密和解密。Web开发中的RSA通常使用JavaScript来实现。通过使用 JavaScript 的RSA库,可以在网页上进行数据的加密和解密操作。同时,也需要生成RSA密钥对,并将公钥嵌入到网页中,以供前端JavaScript代码使用。在Web应用中,RSA算法常用于保护用户的敏感信息,例如在用户密码传输、支付信息等场景中,使用RSA算法加密数据,以确保数据的安全性。 综上所述,Android RSA和Web RSA均是基于RSA算法实现的数据加密和解密方式。Android RSA主要适用于Android系统及相关应用的开发中,而Web RSA则适用于Web开发中对用户信息进行加密保护的场景。两者都能够保障数据的安全性,但具体的实现方式和使用方式会有所不同。 ### 回答2: Android RSA和Web RSA是两种使用RSA算法的应用领域。 Android RSA是指在Android操作系统上使用RSA算法进行数据加密和解密的处理。Android提供了RSA算法的相关API,开发者可以通过这些API实现对数据的加密和解密操作。在Android RSA中,首先需要生成RSA密钥对,包括公钥和私钥。公钥可以分享给其他人用于加密数据,私钥则用于解密。Android RSA可以用于加密敏感数据、保护用户隐私等场景。 Web RSA是指在Web应用中使用RSA算法进行数据加密和解密的处理。在Web开发中,常常使用RSA算法来对用户的敏感信息进行加密传输,确保数据的安全性。Web RSA采用了与Android RSA类似的加密和解密流程,首先生成RSA密钥对,然后使用公钥加密数据,并通过网络传输给服务端,服务端再使用私钥进行解密。 Android RSA和Web RSA在实现上有一些差异。首先,Android RSA是在移动设备上进行加密和解密的,而Web RSA是在服务器端和客户端之间进行传输的。其次,Android RSA需要使用Android提供的API进行密钥生成和加解密操作,而Web RSA可以使用其他语言和库来实现。 综上所述,Android RSA和Web RSA都是使用RSA算法进行数据加密和解密的应用领域。它们的实现方式略有差异,但都可以有效地保护数据的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值