Android 平台DES IV 加密解密随笔

DES加密接触过好多次了,但总容易忘,和服务器交互时,加出来不一致后面能解密成功但是头部是乱码导致小坑了一会,这次记录下来~

根据网上资料和自己的理解,DES是一个基于56位密钥的对称的加密算法,就是两边的密钥需要一致,在此就不考虑为什么不用安全性更高的AES或者采用非对称加密方法,比如RSA等等;关于密钥空间小,可以使用DES的派生算法3DES来进行加密。DES算法是把64位的明文输入块变成64位的密文输出块,所以这里需要BASE64编解码工具类,加密需要3个参数(Key、Data、Mode) Mode是加密还是解密,其它就不解释了,注释写的比较清楚。

下面是加密解密方法:

<span style="font-size:18px;">public class EncryptUtils {public static String encryptDES(String encryptString, String encryptKey)throws Exception {//返回实现指定转换的 Cipher 对象    “算法/模式/填充”Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");//创建一个 DESKeySpec 对象,使用 8 个字节的key作为 DES 密钥的密钥内容。DESKeySpec desKeySpec = new DESKeySpec(encryptKey.getBytes("UTF-8"));//返回转换指定算法的秘密密钥的 SecretKeyFactory 对象。 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");//根据提供的密钥生成 SecretKey 对象。SecretKey secretKey = keyFactory.generateSecret(desKeySpec);//使用 iv 中的字节作为 IV 来构造一个 IvParameterSpec 对象。复制该缓冲区的内容来防止后续修改。IvParameterSpec iv = new IvParameterSpec(encryptKey.getBytes());//用密钥和一组算法参数初始化此 Cipher;Cipher:加密、解密、密钥包装或密钥解包,具体取决于 opmode 的值。cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);//加密同时解码成字符串返回return new String(BASE64.encode(cipher.doFinal(encryptString.getBytes("UTF-8"))));}public static String decryptDES(String decodeString, String decodeKey) throws Exception {//使用指定密钥构造IVIvParameterSpec iv = new IvParameterSpec(decodeKey.getBytes());//根据给定的字节数组和指定算法构造一个密钥。 SecretKeySpec skeySpec = new SecretKeySpec(decodeKey.getBytes(), "DES");//返回实现指定转换的 Cipher 对象Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");//解密初始化cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);//解码返回byte[] byteMi = BASE64.decode(decodeString.toCharArray());byte decryptedData[] = cipher.doFinal(byteMi);return new String(decryptedData);}
}</span>

几个错误需要解释下:

java.security.InvalidAlgorithmParameterException: IV must be 8 bytes long.
java.security.InvalidKeyException: key too short

这两种错误都是key的长度造成的,但官方说密钥是56位长度,这个有点不太明白,但你只要记住key的长度必须是8位!这个地方还请高手赐教!

IV向量:主要作用就是防止篡改的,这个地方如果不一致会导致数据的头部解出来是乱码,而后面正常。

BASE64 编解码工具类

<span style="font-size:18px;"><span style="font-size:18px;">public class BASE64 {static public char[] encode(byte[] data) {char[] out = new char[((data.length + 2) / 3) * 4];for (int i = 0, index = 0; i < data.length; i += 3, index += 4) {boolean quad = false;boolean trip = false;int val = (0xFF & (int) data[i]);val <<= 8;if ((i + 1) < data.length) {val |= (0xFF & (int) data[i + 1]);trip = true;}val <<= 8;if ((i + 2) < data.length) {val |= (0xFF & (int) data[i + 2]);quad = true;}out[index + 3] = alphabet[(quad ? (val & 0x3F) : 64)];val >>= 6;out[index + 2] = alphabet[(trip ? (val & 0x3F) : 64)];val >>= 6;out[index + 1] = alphabet[val & 0x3F];val >>= 6;out[index + 0] = alphabet[val & 0x3F];}return out;}static public byte[] decode(char[] data) {int len = ((data.length + 3) / 4) * 3;if (data.length > 0 && data[data.length - 1] == '=')--len;if (data.length > 1 && data[data.length - 2] == '=')--len;byte[] out = new byte[len];int shift = 0;int accum = 0;int index = 0;for (int ix = 0; ix < data.length; ix++) {int value = codes[data[ix] & 0xFF];if (value >= 0) {accum <<= 6;shift += 6;accum |= value;if (shift >= 8) {shift -= 8;out[index++] = (byte) ((accum >> shift) & 0xff);}}}if (index != out.length)throw new Error("miscalculated data length!");return out;}static private char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".toCharArray();static private byte[] codes = new byte[256];static {for (int i = 0; i < 256; i++)codes[i] = -1;for (int i = 'A'; i <= 'Z'; i++)codes[i] = (byte) (i - 'A');for (int i = 'a'; i <= 'z'; i++)codes[i] = (byte) (26 + i - 'a');for (int i = '0'; i <= '9'; i++)codes[i] = (byte) (52 + i - '0');codes['+'] = 62;codes['/'] = 63;}
}</span></span>

加密解密使用

<span style="font-size:18px;">  try {String en_Str = EncryptUtils.encryptDES("data20141117", "key12345");String de_Str = EncryptUtils.decryptDES(en_Str, "key12345");Log.i("MainActivity", "en_Str:"+en_Str);Log.i("MainActivity", "de_Str:"+de_Str);} catch (Exception e) {e.printStackTrace();}</span>

Android 平台DES IV 加密解密随笔相关推荐

  1. 开放平台的消息加密解密技术方案-柚果云开发日志

    一,消息加密解密 1) 注意:开放平台的消息加密解密技术方案基AES加解密算法 常见错误: xml 格式不对:如写成了 (s 小写了且 p 和>中间有空格 公众平台网站提供了修改 Encodin ...

  2. android中base64加密,Android应用开发之android自带Base64加密解密

    本文将带你了解Android应用开发之android自带Base64加密解密,希望本文对大家学Android有所帮助. android项目引用不到以下两个java类 import sun.misc.B ...

  3. pyDes 实现 Python 版的 DES 对称加密/解密--转

    https://my.oschina.net/leejun2005/blog/586451 手头有个 Java 版的 DES 加密/解密程序,最近想着将其 Python 重构下,方便后续脚本解析,捣鼓 ...

  4. DES 算法加密/解密源码

    //复制粘贴即可使用 class Program{static void Main(string[] args){string value = null;string jeiguo = null;wh ...

  5. DES的加密解密在ECB上的使用(C语言实现)——大三密码学实验

    目录 实验内容 实验原理 DES加密解密 ECB(电码本模式) 代码 DES函数的构建 RE_DES函数的构建 ECB函数的构建 RE_ECB的函数的构建 主函数的构建 总代码 测试结果 实验内容 输 ...

  6. Qt实现DES ECB加密解密

    环境:Windows11 64位 工具链:MinGW32 IDE:Qt 5.14 Qt使用DES加密需要用到OpenSSL库,首先要确定当前使用的Qt所支持的SSL版本. 编译OpenSSL 查看当前 ...

  7. vue使用DES模式加密解密,包括Java加密解密

    前端加密解密 1.安装:npm install crypto-js 2.在utils下创建一个cryptoAES.js import CryptoJS from 'crypto-js';//与后端约定 ...

  8. VC实现数据的加密和解密(MD5加密/DES/RSA加密解密)

    VC实现数据的加密和解密 由于生产实习的时间有限,加上自己这段时间致力于考研,因此,仅仅是实现了通过MD5/DES/RSA的简单的字符串的加密解密,希望有兴趣的兄弟姐妹能够完善它. 主要的程序如下: ...

  9. Java代码实现DES算法加密解密功能

    一.概述 DES加密算法是一种对称加密,所谓对称加密就是加密和解密都是用同一把密钥. 二.详细代码 import javax.crypto.BadPaddingException; import ja ...

最新文章

  1. java selenium (十四) 处理Iframe 中的元素
  2. 英特尔高通网上打嘴仗,可看起来更像是夸自己
  3. Windows PE 第十三章 PE补丁技术
  4. “面试不败计划”:集合知识整体总结
  5. 20应用统计考研复试要点(part34)--简答题
  6. 蓝桥杯 算法提高 日期计算
  7. Android 2.2 带来全新拍照增强特性
  8. linux线程相关函数接口
  9. 解线性方程组的迭代法(雅可比、高斯-塞德尔迭代法)
  10. 数据中心热度高 苹果也来掺一脚
  11. 在Android上使用AutoNavi Map API开发自己的地图应用程序
  12. Prewitt算子边缘检测原理及实现
  13. 自己写了一个小小的双色球号码随机生成器
  14. 转载 兼容iphone5开发获取屏幕分辨率的问题
  15. 下载谷歌浏览器官方正式(稳定)版以及历史各种版本
  16. cad导入mysql_CAD插入一个数据库
  17. 示波器带宽和采样率与被测信号的关系(转)
  18. 将社会工程学演绎成艺术---弗兰克·威廉·阿巴内尔的传奇故事--黑客博客
  19. Nginx配置https(ssl证书)并反向代理Springboot Jar项目
  20. IT行业人才招聘回顾与展望

热门文章

  1. 【算法】CAS的实现和无锁编程
  2. 工行U盾检测不到,Giesecke Devrient StarKey无法安装 解决办法
  3. bagging和boosting算法(集成学习算法)
  4. 现在想拿到20k的高薪offer,到底是不是痴人说梦
  5. 《缠中说禅108课》55:买之前戏,卖之高潮
  6. Linux 安装搭建 tftpd 服务器
  7. 江苏科技大学c语言程序设计考试,【江苏科技大学】vc语言全国计算机二级试题及答案课程设计实践报告(全)...
  8. 一个程序员转行做农业的经历(ZT自天涯),大家看看作者:zhouyutang
  9. CS231n 之 INTRODUCTION
  10. QSS和QML的区别(简单了解)