700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > android java rsa加密_Android RSA与Java RSA加密不一样标准产生问题的解决方法

android java rsa加密_Android RSA与Java RSA加密不一样标准产生问题的解决方法

时间:2020-08-11 00:41:12

相关推荐

android java rsa加密_Android RSA与Java RSA加密不一样标准产生问题的解决方法

最近作一个基于android的客户端,客户端与Java服务器 (MyEclipse自带的Tomcat服务器)的通讯须要实施安全方案。而本人是使用非对称密钥来对数据进行加密的,客户端用公钥加密,服务器用私钥解 密。所以本人就用非对称密钥RSA算法来实施。而本人在最开始的时候,在android平台上与服务端初始化Cipher的时候都是使用一下这种方式:java

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

cipher.init(Cipher.ENCRYPT_MODE, key);

int blockSize = cipher.getBlockSize();

在这种状况下,android平台的客户端能够加密成功。而到了服务器这一端却没法解密,却抛出了如下异常:android

“java.lang.Exception: Blocktype mismatch: 0”算法

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

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

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

首先是环境配置:服务器

第一步:dom

首先须要得到“BouncyCastleProvider”的jar包。ide

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

第二步:

须要在服务器上的目录:“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=.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());

值得注意的有两点:

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

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

至此,由Android RSA与JavaRSA加密标准不一样产生能够完全解决了。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。