做过android 端 rsa 加密的朋友估计都会遇到一些问题。本人这个问题苦恼了我2天的时间最终搞定。
大体说下遇到的问题吧:
客户端生成的秘钥对于同一个字符串而言,一直是相同的比如我用 随机串 “123456” 生成两次 ,得到的结果都是一个值。
客户端生成的秘钥服务端没法解密。(提示秘钥损坏、字符串过程、字符非法等等)
客户端生成的秘钥没法放到头文件 (里面有好多空格)
解决的方案:
对于第一个问题: 服务端对于这个对象的创建是这样的
Cipher cipher = Cipher.getInstance("RSA")
接下来android 客户端也是这样的Cipher加密方式 但是里面的加密方式不可以这样写,要改成如下的样式
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding")具体什么原因自己可以去百度下。第二个问题:客户端生成的秘钥服务端没法解密,这个我们要先检查下 自己生成的加密字符串和服务端加密的字符串长度是否一样,尽量里面不能有空格。java里面对字符串进行Base64规范传输的时候是要的java.util包下的Base64或者 BASE64Encoder()这个文件 ,在这里建议大家不要去用这两个包,因为andorid里面是没有这两个包的即使你的jdk版本里面是带有的你也拿不到。也不要想着去下载一个jar包。在这里大家就用android.util.Base64下的包。第三个问题是重点:Base64.encode()的构造方法中是需要串flag参数的。对于Base64.DEFAULT他对你的格式不改变只是做个规范传输。针对第二步我们可以打印下生成出来的加密字符串,虽然有时你看不出来有空格或者换行,但是实际拷贝到文件中的时候是能看出来的。所以这时候我们就不能用Base64.DEFAULT这个flag 我们要选用 Base64.NO_WRAP 这个可以帮你把所有格式清除掉。到这里基本上问题就不到了。我们来看下实际的代码吧。这里给大家提供一个秘钥值
private static final String PUCLIC_KEY ="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD/jU7MtLJxDdA+hWv5wxyOHw4I\n" + "YhULJMdpj4aoEKPtHVzfZkrdoHPj0JYPzBZmpChb3Eut63pryBq+rZHideSDfI56\n" + "ETpxZ6P6euRzDVRPjGS+5HoZf5pB3cmQok4SYLkhYy2f1v6tWpEpA6tOBVKcUD1q\n" + "VMm2Bva9sf7zFSJzCwIDAQBC" ;//我这边直接把公钥key拿出来了。实际项目中你们可以放到assets中,其他地方能获取到的都行
//放在文件中你可以直接用Object流读取
// ObjectInputStream o = new ObjectInputStream("带上你的assets流"); // RSAPublicKey publicKey=(RSAPublicKey)o.readObject();byte[] buffer = Base64.decode(PUCLIC_KEY, Base64.NO_WRAP); KeyFactory keyFactory = null; try { keyFactory = KeyFactory.getInstance("RSA");//这个地方一定要和和服务端的保持一致 这是个行标。用它来生成一个RSAPublicKey X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer); RSAPublicKey publicKey = (RSAPublicKey) keyFactory.generatePublic(keySpec); //这边也是重点"RSA/ECB/PKCS1Padding" 这个地方客户端必须要这样写
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");//此处如果写成"RSA"加密出来的信息JAVA服务器无法解析 cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] output = cipher.doFinal("123456".getBytes("utf-8")); miwen = Base64.encodeToString(output, Base64.NO_WRAP); } catch (Exception e) { e.printStackTrace(); }好了都这里基本都解决了。还有个AES加密 估计还有问题有问题的话下一章就是写它了。不明白的或者需要给建议的可以发 油件 吧 henry.geng@aliyun.com