1、简述

DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。其是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法。

2、模型分析

消息传递经过以下步骤:

(1)、由消息传递双方约定密钥,这里由甲方构建密钥;

(2)、由密钥构建者公布密钥,这里由甲方公布给乙方;

(3)、由消息发送方使用密钥对数据加密,这里由甲方对数据加密;

(4)、由消息发送方将加密数据发送给消息接收者,这里由甲方将加密数据发送给乙方;

(5)、由消息接收方使用密钥对加密数据解密,这里由乙方完成数据解密;

对称加密算法idea 对称加密算法des_ci

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 数据加密标准,是对称加密算法领域中的典型算法, 

   优点:算法公开、计算量小、加密速度快、加密效率高。

   缺点:交易双方都使用同样钥匙,安全性得不到保证;

            每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量呈几何级数增长,密钥管理成为用户的负担。对称加密算法在分布式网络系统上使用较为困难,主要是因为密钥管理困难,使用成本较高。