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 数据加密标准,是对称加密算法领域中的典型算法,
优点:算法公开、计算量小、加密速度快、加密效率高。
缺点:交易双方都使用同样钥匙,安全性得不到保证;
每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量呈几何级数增长,密钥管理成为用户的负担。对称加密算法在分布式网络系统上使用较为困难,主要是因为密钥管理困难,使用成本较高。