博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对称加密算法-DES
阅读量:7004 次
发布时间:2019-06-27

本文共 3347 字,大约阅读时间需要 11 分钟。

hot3.png

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

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

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

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

转载于:https://my.oschina.net/u/1387400/blog/1505058

你可能感兴趣的文章