android 端RSA加密过程中遇到的坑
来源:互联网 发布:现代风格家具品牌 知乎 编辑:程序博客网 时间:2024/06/08 01:25
做过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
0 0
- android 端RSA加密过程中遇到的坑
- iOS 【在 RSA 加密中遇到的一些坑
- Android RSA加密,通过模数和指数生成秘钥在加密遇到的坑
- android开发中Rsa加密的使用
- android的RSA加密
- android RSA和Java RSA加密不一致的坑
- android RSA加密的使用
- RSA加密和解密的完整过程
- RSA加密过程
- Android中RSA+BASE64加密解密
- android RSA 使用公钥加密里的坑
- 当服务端为PHP时Android端的RSA加密
- Android 中 非对称(RSA)加密和对称(AES)加密
- Android 中 非对称(RSA)加密和对称(AES)加密
- Android 与 .net 互通的RSA加密
- Android 与 .net 互通的RSA加密
- Android RSA加密解密功能的实现
- .net中RSA的加密与解密
- 关于RGB的转换为十六进制的问题
- JavaScript学习记录(3)
- 扛住100亿次请求?我们来试一试
- java--19--List及其实现类与子接口
- Hali-Bula的晚会(UVa1220)详细题解
- android 端RSA加密过程中遇到的坑
- A cycle was detected in the build path of project 感叹号
- Ubuntu关机&耳机插拔声音异常解决方案
- Java ---多线程2
- Phoenix映射HBase数据表
- JAVA 泛型浅谈(1)
- 常见的机器学习&数据挖掘知识点
- 文章标题Hadoop使用小结
- PC端、移动端都可以用的图片轮播(左右滑动切换)插件及使用