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加密 估计还有问题有问题的话下一章就是写它了。不明白的或者
需要给建议的可以发  油件 吧  henry.geng@aliyun.com





  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rnwater

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值