DES加密如何保持一致

在我们的应用程序涉及到比较敏感的数据的时候,我们通常会对数据进行简单的加密。在与服务器之间的数据交互中,除了可以使用post请求来增强数据的安全性之外,我们可以使用常见的加密算法,对数据进行加密。今天主要介绍的是DES加密算法。

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

 

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

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

 

001. package com.qust.rollcallstudent.utils;
002.  
003. import java.security.InvalidAlgorithmParameterException;
004. import java.security.Key;
005. import java.security.spec.AlgorithmParameterSpec;
006. import java.util.Locale;
007.  
008. import javax.crypto.Cipher;
009. import javax.crypto.SecretKeyFactory;
010. import javax.crypto.spec.DESKeySpec;
011. import javax.crypto.spec.IvParameterSpec;
012.  
013. /**
014. *
015. * @ClassName: com.qust.rollcallstudent.utils.DESUtil
016. * @Description: DES加密解密工具包
017. * @author zhaokaiqiang
018. * @date 2014-11-13 下午8:40:56
019. *
020. */
021. public class DESUtil {
022.  
023. public static final String ALGORITHM_DES = "DES/CBC/PKCS5Padding";
024.  
025. /**
026. * DES算法,加密
027. *
028. * @param data
029. *            待加密字符串
030. * @param key
031. *            加密私钥,长度不能够小于8位
032. * @return 加密后的字节数组,一般结合Base64编码使用
033. * @throws InvalidAlgorithmParameterException
034. * @throws Exception
035. */
036. public static String encode(String key, String data) {
037. if (data == null)
038. return null;
039. try {
040. DESKeySpec dks = new DESKeySpec(key.getBytes());
041. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
042. // key的长度不能够小于8位字节
043. Key secretKey = keyFactory.generateSecret(dks);
044. Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
045. IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());
046. AlgorithmParameterSpec paramSpec = iv;
047. cipher.init(Cipher.ENCRYPT_MODE, secretKey, paramSpec);
048. byte[] bytes = cipher.doFinal(data.getBytes());
049. return byte2String(bytes);
050. catch (Exception e) {
051. e.printStackTrace();
052. return data;
053. }
054. }
055.  
056. /**
057. * DES算法,解密
058. *
059. * @param data
060. *            待解密字符串
061. * @param key
062. *            解密私钥,长度不能够小于8位
063. * @return 解密后的字节数组
064. * @throws Exception
065. *             异常
066. */
067. public static String decode(String key, String data) {
068. if (data == null)
069. return null;
070. try {
071. DESKeySpec dks = new DESKeySpec(key.getBytes());
072. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
073. // key的长度不能够小于8位字节
074. Key secretKey = keyFactory.generateSecret(dks);
075. Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
076. IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());
077. AlgorithmParameterSpec paramSpec = iv;
078. cipher.init(Cipher.DECRYPT_MODE, secretKey, paramSpec);
079. return new String(cipher.doFinal(byte2hex(data.getBytes())));
080. catch (Exception e) {
081. e.printStackTrace();
082. return data;
083. }
084. }
085.  
086. /**
087. * 二行制转字符串
088. *
089. * @param b
090. * @return
091. */
092. private static String byte2String(byte[] b) {
093. StringBuilder hs = new StringBuilder();
094. String stmp;
095. for (int n = 0; b != null && n < b.length; n++) {
096. stmp = Integer.toHexString(b[n] & 0XFF);
097. if (stmp.length() == 1)
098. hs.append('0');
099. 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模式指的是电子密码本模式,是一种最古老,最简单的模式,将加密的数据分成若干组,每组的大小跟加密密钥长度相同;然后每组都用相同的密钥加密, 比如DES算法, 如果最后一个分组长度不够64位,要补齐64位。这种模式的特点是:

 

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

2.数据块重复排序不需要检测;

3.相同的明文块(使用相同的密钥)产生相同的密文块,容易遭受字典攻击;

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.采用相同的填充模式

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值