转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992

在我们的应用程序涉及到比較敏感的数据的时候,我们一般会对数据进行简单的加密。在与server之间的数据交互中,除了能够使用post请求来增强数据的安全性之外。我们能够使用常见的加密算法。对数据进行加密。

今天主要介绍的是DES加密算法。

首先。DES属于一种对称的加密算法,所谓对称。就是说加密和解密使用的都是同一个密钥,那么在我们实际应用的时候,就是指server和client进行加密解密的时候。使用的是一个同样的密钥。除此之外。还有非对称加密算法,就是公钥私钥机制,这样的方式能够被用来进行身份验证,这个以后再细说。

DES全称为Data EncryptionStandard,即数据加密标准,是一种使用密钥加密的块算法。DES算法的入口參数有三个:Key、Data、Mode。当中Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。

以下是在Java或者是Android里面,进行DES加密的代码实现

  1. package com.qust.rollcallstudent.utils;
  2.  
  3. import java.security.InvalidAlgorithmParameterException;
  4. import java.security.Key;
  5. import java.security.spec.AlgorithmParameterSpec;
  6. import java.util.Locale;
  7.  
  8. import javax.crypto.Cipher;
  9. import javax.crypto.SecretKeyFactory;
  10. import javax.crypto.spec.DESKeySpec;
  11. import javax.crypto.spec.IvParameterSpec;
  12.  
  13. /**
  14. *
  15. * @ClassName: com.qust.rollcallstudent.utils.DESUtil
  16. * @Description: DES加密解密工具包
  17. * @author zhaokaiqiang
  18. * @date 2014-11-13 下午8:40:56
  19. *
  20. */
  21. public class DESUtil {
  22.  
  23. public static final String ALGORITHM_DES = "DES/CBC/PKCS5Padding";
  24.  
  25. /**
  26. * DES算法,加密
  27. *
  28. * @param data
  29. * 待加密字符串
  30. * @param key
  31. * 加密私钥,长度不能够小于8位
  32. * @return 加密后的字节数组。一般结合Base64编码使用
  33. * @throws InvalidAlgorithmParameterException
  34. * @throws Exception
  35. */
  36. public static String encode(String key, String data) {
  37. if (data == null)
  38. return null;
  39. try {
  40. DESKeySpec dks = new DESKeySpec(key.getBytes());
  41. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
  42. // key的长度不能够小于8位字节
  43. Key secretKey = keyFactory.generateSecret(dks);
  44. Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
  45. IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());
  46. AlgorithmParameterSpec paramSpec = iv;
  47. cipher.init(Cipher.ENCRYPT_MODE, secretKey, paramSpec);
  48. byte[] bytes = cipher.doFinal(data.getBytes());
  49. return byte2String(bytes);
  50. } catch (Exception e) {
  51. e.printStackTrace();
  52. return data;
  53. }
  54. }
  55.  
  56. /**
  57. * DES算法,解密
  58. *
  59. * @param data
  60. * 待解密字符串
  61. * @param key
  62. * 解密私钥,长度不能够小于8位
  63. * @return 解密后的字节数组
  64. * @throws Exception
  65. * 异常
  66. */
  67. public static String decode(String key, String data) {
  68. if (data == null)
  69. return null;
  70. try {
  71. DESKeySpec dks = new DESKeySpec(key.getBytes());
  72. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
  73. // key的长度不能够小于8位字节
  74. Key secretKey = keyFactory.generateSecret(dks);
  75. Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
  76. IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());
  77. AlgorithmParameterSpec paramSpec = iv;
  78. cipher.init(Cipher.DECRYPT_MODE, secretKey, paramSpec);
  79. return new String(cipher.doFinal(byte2hex(data.getBytes())));
  80. } catch (Exception e) {
  81. e.printStackTrace();
  82. return data;
  83. }
  84. }
  85.  
  86. /**
  87. * 二行制转字符串
  88. *
  89. * @param b
  90. * @return
  91. */
  92. private static String byte2String(byte[] b) {
  93. StringBuilder hs = new StringBuilder();
  94. String stmp;
  95. for (int n = 0; b != null && n < b.length; n++) {
  96. stmp = Integer.toHexString(b[n] & 0XFF);
  97. if (stmp.length() == 1)
  98. hs.append('0');
  99. hs.append(stmp);
  100. }
  101. return hs.toString().toUpperCase(Locale.CHINA);
  102. }
  103.  
  104. /**
  105. * 二进制转化成16进制
  106. *
  107. * @param b
  108. * @return
  109. */
  110. private static byte[] byte2hex(byte[] b) {
  111. if ((b.length % 2) != 0)
  112. throw new IllegalArgumentException();
  113. byte[] b2 = new byte[b.length / 2];
  114. for (int n = 0; n < b.length; n += 2) {
  115. String item = new String(b, n, 2);
  116. b2[n / 2] = (byte) Integer.parseInt(item, 16);
  117. }
  118. return b2;
  119. }
  120.  
  121. }

假设大家仅仅是想用,就能够不用往下看了。以下開始说一些关于DES算法的细节。

在上面的加密和解密的方法里面。我们在获取Cipher实例的时候。传入了一个字符串"DES/CBC/PKCS5Padding"。这三个參数是什么意思呢?

实际上。这三个參数分别相应的是“算法/模式/填充”,也就是说我们要用DES算法进行加密,採用的是CBC模式。填充方式採用PKCS5Padding。

除了CBC模式,还有ECB模式等,指的是不同的加密方式。

那么CBC模式和ECB模式又有什么差别呢?

ECB模式指的是电子password本模式,是一种最古老,最简单的模式。将加密的数据分成若干组,每组的大小跟加密密钥长度同样;然后每组都用同样的密钥加密, 比方DES算法, 假设最后一个分组长度不够64位,要补齐64位。

这样的模式的特点是:

1.每次Key、明文、密文的长度都必须是64位;

2.数据块反复排序不须要检測;

3.同样的明文块(使用同样的密钥)产生同样的密文块。easy遭受字典攻击;

4.一个错误仅仅会对一个密文块产生影响;

CBC模式指的是加密块链模式,与ECB模式最大的不同是增加了初始向量。以下的代码就是获取一个初始向量。

IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());

这样的模式的特点是:

1.每次加密的密文长度为64位(8个字节);

2.当同样的明文使用同样的密钥和初始向量的时候CBC模式总是产生同样的密文;

3.密文块要依赖曾经的操作结果,所以,密文块不能进行又一次排列;

4.能够使用不同的初始化向量来避免同样的明文产生同样的密文,一定程度上抵抗字典攻击;

5.一个发生错误以后,当前和以后的密文都会被影响;

PKCS5Padding參数则是在说明当数据位数不足的时候要採用的数据补齐方式,也能够叫做数据填充方式。

PKCS5Padding这样的填充方式,详细来说就是“填充的数字代表所填字节的总数”

比方说,差两个字节,就是######22,差5个字节就是###55555。这样依据最后一个自己就能够知道填充的数字和数量。

介绍完DES的这些细节之后,我们就能够知道。在不同的平台上,仅仅要能保证这几个參数的一致。就能够实现加密和解密的一致性。

1.加密和解密的密钥一致

2.採用CBC模式的时候,要保证初始向量一致

3.採用同样的填充模式

【Android工具类】怎样保证Android与server的DES加密保持一致的更多相关文章

  1. [Android Pro] 常用的android工具类和库

    reference to  : http://blog.csdn.net/lovexieyuan520/article/details/50614086 这篇博客主要记录我认为比较有用的Android ...

  2. 摘录android工具类

    import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.Pac ...

  3. android 工具类 数据库管理

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/xuduzhoud/article/details/27540301 数据库工具类,优雅的管理andr ...

  4. Android工具类整合

    Android-JSONUtil工具类 常用的Json工具类,包含Json转换成实体.实体转json字符串.list集合转换成json.数组转换成json public class JSONUtil ...

  5. Android 工具类大全

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38965311 1.日志工具类L.java package com.zhy.uti ...

  6. 【Android 工具类】经常使用工具类(方法)大全

    收集经常使用的工具类或者方法: 1.获取手机分辨率 /** * 获取手机分辨率 */ public static String getDisplayMetrix(Context context) { ...

  7. Android 工具类 SharedPreferences 封装

    SharedPreferences 是 Android 数据存储方式中的一种,特别适合用来存储少量的.格式简单的数据,比如应用程序的各种配置信息,如是否打开音效,是否开启震动等等. SharedPre ...

  8. 【Android工具类】用户输入非法内容时的震动与动画提示——EditTextShakeHelper工具类介绍

    转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 当用户在EditText中输入为空或者是数据异常的时候,我们能够使用Toast来提醒用户,除此之外,我们还能 ...

  9. android 工具类之SharePreference

    /** * SharedPreferences的一个工具类,调用setParam就能保存String, Integer, Boolean, Float, Long类型的参数 * 同样调用getPara ...

随机推荐

  1. openGL初学函数解释汇总

    openGL初学函数解释汇总 1.GLUT工具包提供的函数 //GLUT工具包所提供的函数 glutInit(&argc, argv);//对GLUT进行初始化,这个函数必须在其它的GLUT使 ...

  2. 求LCA最近公共祖先的在线ST算法_C++

    ST算法是求最近公共祖先的一种 在线 算法,基于RMQ算法,本代码用双链树存树 预处理的时间复杂度是 O(nlog2n)   查询时间是 O(1) 的 另附上离线算法 Tarjan 的链接: http ...

  3. SpringBoot设置事务管理

    关于事务就不介绍了,前面在研究spring的时候就已经研究过了,参考:https://www.cnblogs.com/qlqwjy/p/7296493.html 这里直接研究springboot中事务 ...

  4. 蓝牙攻击指南(kali)

    基本操作 hciconfig 查看蓝牙设备信息 hcitool:这是一个查询工具. 可以用来查询设备名称,设备ID,设备类别和设备时钟. hcidump:可以使用这个来嗅探蓝牙通信 hciconfig ...

  5. linux下挂载U盘【转】

    转自:http://www.cnblogs.com/yeahgis/archive/2012/04/05/2432779.html 一.Linux挂载U盘:1.插入u盘到计算机,如果目前只插入了一个u ...

  6. LPTSTR\LPCTSTR\LPWSTR\LPCWSTR 字母的意思 及 区别

    标签: 杂谈 分类: VC     char*   是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容.        LP的含义 ...

  7. UVA 753 A Plug for UNIX

    最大流解决 . 设置源点 0,连接所有设备(device) .设备-插头 -汇点 #include <map> #include <set> #include <list ...

  8. Linux Suspend过程【转】

    转自:http://blog.csdn.net/chen198746/article/details/15809363 目录(?)[-] Linux Suspend简介 Suspend流程 enter ...

  9. 如何防止Android反编译

    转自: http://my.eoe.cn/sandking/archive/19772.html http://www.cnblogs.com/zdz8207/archive/2012/01/28/d ...

  10. gitlib 安装

    参考文件https://www.cnblogs.com/rslai/p/9109624.html