1、简述
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。其是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法。
2、模型分析
消息传递经过以下步骤:
(1)、由消息传递双方约定密钥,这里由甲方构建密钥;
(2)、由密钥构建者公布密钥,这里由甲方公布给乙方;
(3)、由消息发送方使用密钥对数据加密,这里由甲方对数据加密;
(4)、由消息发送方将加密数据发送给消息接收者,这里由甲方将加密数据发送给乙方;
(5)、由消息接收方使用密钥对加密数据解密,这里由乙方完成数据解密;
3、实现
工作入口参数有三个:key、data、mode。key 为加密解密使用的密钥,data 为加密 解密的数据,mode 为其工作模式。当模式为加密模式时,明文按照 64 位进行分组,形成明文组,key 用于对数据加密,当模式为解密模式时,key 用于对数据解密。实际运用中,密钥只用到了 64 位中的 56 位,这样才具有高的安全性。
在通信网络的两端,双方约定一致 的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的 Key对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据(如PIN、MAC等)在公共通信网中传输的安全性和可靠性。
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
* 注意:DES加密和解密过程中,密钥长度都必须是8的倍数
*/
public class DESCoder {
/**密钥算法*/
private final static String DES = "DES";
/***/
private final static String encode = "utf-8";
/**
* DES 加密
* @param data
* @param key
* @return
*/
public static String encrypt(byte[] data, String key) throws Exception{
SecureRandom secureRandom = new SecureRandom();
DESKeySpec desKeySpec = new DESKeySpec(key.getBytes(encode));
//创建一个密匙工厂,然后用它把DESKeySpec转换成
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
SecretKey securekey = keyFactory.generateSecret(desKeySpec);
//Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance(DES);
//用密匙初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, securekey, secureRandom);
//正式执行加密操作
byte[] bt = cipher.doFinal(data);
return new BASE64Encoder().encode(bt);
}
/**
* DES 解密
* @param src
* @param password
* @return
*/
public static String decrypt(String encryStr, String password) throws Exception{
BASE64Decoder decoder = new BASE64Decoder();
byte[] encryArr = decoder.decodeBuffer(encryStr);
// DES算法要求有一个可信任的随机数源
SecureRandom random = new SecureRandom();
DESKeySpec desKey;
// 创建一个DESKeySpec对象
desKey = new DESKeySpec(password.getBytes(encode));
// 创建一个密匙工厂
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
// 将DESKeySpec对象转换成SecretKey对象
SecretKey securekey = keyFactory.generateSecret(desKey);
// Cipher对象实际完成解密操作
Cipher cipher = Cipher.getInstance("DES");
// 用密匙初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, securekey, random);
// 真正开始解密操作
byte[] arr = cipher.doFinal(encryArr);
return new String(arr, encode);
}
public static void main(String[] args) {
String sourceData = "DES 测试";
String defaultKey = "test1234";
try {
String encStr = encrypt(sourceData.getBytes(encode), defaultKey);
System.out.println(sourceData +"-DES加密后:"+ encStr);
String decStr = decrypt(encStr, defaultKey);
System.out.println(sourceData +"-DES解密后:"+ decStr);
/***
* Console结果:
* DES 测试-DES加密后:VbWhbgtPKdqkyOgovNWCFQ==
* DES 测试-DES解密后:DES 测试
*/
} catch (Exception e) {
e.printStackTrace();
}
}
}
4、小结
DES 数据加密标准,是对称加密算法领域中的典型算法,
优点:算法公开、计算量小、加密速度快、加密效率高。
缺点:交易双方都使用同样钥匙,安全性得不到保证;
每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量呈几何级数增长,密钥管理成为用户的负担。对称加密算法在分布式网络系统上使用较为困难,主要是因为密钥管理困难,使用成本较高。