踩过的坑—DES加密解密
来源:互联网 发布:剑三帅气成男脸型数据 编辑:程序博客网 时间:2024/06/05 08:16
最近公司项目里面要对接口进行加密,服务端选用了DES来加密,作为小Android,只有去学习一些DES的基本用法,这不看不知道,有好几个大坑。 坑一:我们公司所用的框架是OKHTTP+retrofit+Rxjava,那么问题来了,我最开始是在okhttp返回的数据的时候来解密,但是获取到的死活为空
(服务端肯定没问题,因为IOS都解密成功了),然后各种百度,各种问人,后来我们公司一个Android的大神告诉我,okhttp好像是封装了解析器,在拿到数据得时候就解析过一次了,这就尴尬了,好吧,这个没办法了,只有自己重新写数据请求从服务端获取数据了(这个办法只适合少数接口,如果全部解密的话,个人建议写一个拦截器,再自己写一个数据解析器,我们公司只有几个接口,就没那个必要了)。
坑二:用了nohttp来把数据拿到了,拿到数据的时候,好高兴哦,一串很长的乱码,但是解密的时候出了问题,拿到的数据在网上DES在线解析能解
开,没毛病,但是拿到解密的代码里面,握了个草,解不开了,然后各种
试,最开始我以为是代码里面数据长度超过限制了,然后又是各种百度,
各种问人,然后那天加班搞,反正服务端不承认有问题(毕竟大牛嘛),
最后数据一遍一遍的取,一遍一遍的解析,对照,后来发现了一个很大的问题,
***DES在加密解密的时候会约定好,采用什么加密模式,采用什么填充,
// Cipher对象实际完成解密操作
Cipher cipher = Cipher.getInstance(“DES/ECB/NoPadding”);
*原来是后台加密后,没给我说是什么填充。所以肯定解不开了,又是一个大坑。
还有一点,就是百度到的很多加密解密会用到一个Base64的类,而且还会手动给你写一个Base64类,这完全没必要的,因为Android自带了一个Base64类,直接用就行:android.util.Base64,代码如下:
byte[] byteMi = android.util.Base64.decode(data,0);
最后贴下代码哈,百度很多的:
这是加密的,传入你要加密的字符串,第二个参数是设置密码,调用这个方法会返回一个加密后的一串奇奇怪怪的东西public static String encryptDES(String encryptString, String encryptKey) throws Exception { SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes(), "DES"); Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding"); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] encryptedData = cipher.doFinal(encryptString.getBytes()); return Base64.encode(encryptedData);}这是解密的,传入你要解密的那一串奇怪的东西,输入密码,就会返回正常的字符串: public static String decryptDES(String decryptString, String decryptKey) throws Exception { byte[] byteMi = android.util.Base64.decode(decryptString,0); SecretKeySpec key = new SecretKeySpec(decryptKey.getBytes(), "DES"); Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding"); cipher.init(Cipher.DECRYPT_MODE, key); byte decryptedData[] = cipher.doFinal(byteMi); return new String(decryptedData);}
其实如果密码固定的话,还可以这样写,只需要调用的时候传入数据源就行了,一样的效果
private static final String DES_KEY="密码"; public static String decrypt(String data) throws Exception { byte[] byteMi = android.util.Base64.decode(data,0); // DES算法要求有一个可信任的随机数源 SecureRandom sr = new SecureRandom(); // 从原始密匙数据创建一个DESKeySpec对象 DESKeySpec dks = new DESKeySpec(DES_KEY.getBytes()); // 创建一个密匙工厂,然后用它把DESKeySpec对象转换成 // 一个SecretKey对象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES_ALGORITHM); SecretKey securekey = keyFactory.generateSecret(dks); // Cipher对象实际完成解密操作 Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding"); // 用密匙初始化Cipher对象 cipher.init(Cipher.DECRYPT_MODE, securekey); // 现在,获取数据并解密 // 正式执行解密操作 return new String(cipher.doFinal(byteMi));}方法调用的时候就简单了撒:String d=DES.decrypt(response.get().toString());直接简单粗暴,返回的string 就想怎么玩就怎么玩咯。
- 踩过的坑—DES加密解密
- 我亲自使用过的DES加密解密
- DES的加密解密
- C#的des加密解密
- C# 的 DES 加密解密
- ASP的DES加密解密
- DES加密/解密的应用
- DES加密/解密的应用
- 封装好的加密解密函数(URL加密解密、sha1加密解密、des加密解密)
- DES/3DES加密,解密
- 支持中文加密解密的DES算法
- 修改后的DES加密解密程序
- DES加密解密的详细例子
- C#的DES加密解密算法【vs2005】
- php的des加密解密实例
- DES加密与解密算法的实现
- c#中DES加密解密的类
- C#的DES加密解密算法
- 前端演进史
- linux下shell script学习(二)
- java静态变量,静态方法的理解
- STL库容器vector Operators赋值,比较函数
- thread join
- 踩过的坑—DES加密解密
- 【背包->最短路】洛谷2662[牛场围栏]题解
- 牛客网的java面试题
- WUST 1906 演讲大厅安排,饥饿的牛(dp+线段覆盖经典)
- mysql数据库实现读写分离
- 使用Androidstudio时按generate键,提示IllegalArgumentException: cannot add an action twice: Generate Butterkn
- STL库容器 vector assign赋值函数
- 动态数据结构-动态建立链表
- 166链表倒数第n个节点