android 端RSA加密过程中遇到的坑


做过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加密 估计还有问题有问题的话下一章就是写它了。不明白的或者
需要给建议的可以发  油件 吧  [email protected]





你可能感兴趣的:(Android疑难问题解决,android,rsa,加密)