DES算法和DESede算法统称DES系列算法。DES算法是对称加密算法领域中的典型算法,为后续对称加密算法的发展奠定了坚实的基础。但是DES算法密钥偏短,仅有56位,迭代次数偏少,受到诸如查分密码分析和线性密码分析等各种攻击威胁,安全性受到严重威胁。不仅如此,由于DES算法具有半公开性质,被怀疑存在美国国家安全局安置的后门,受到各大密码学机构的强烈质疑。以后的文章中会具体描述一下AES算法。

  生产密钥,对数据加密、解密

  1 package test;
  2 
  3 import java.security.Key;
  4 
  5 import javax.crypto.Cipher;
  6 import javax.crypto.KeyGenerator;
  7 import javax.crypto.SecretKey;
  8 import javax.crypto.SecretKeyFactory;
  9 import javax.crypto.spec.DESKeySpec;
 10 
 11 /**
 12  * DES安全编码组件
 13  */
 14 public abstract class DESCoder {
 15     /**
 16      * 密钥算法
 17      * java 7只支持56位密钥
 18      * Bouncy Castle 支持64位密钥
 19      */
 20     public static final String KEY_ALGORITHM = "DES";
 21     /**
 22      * 加密/解密算法 /工作模式/填充方式
 23      */
 24     public static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5Padding";
 25     /**
 26      * 转换密钥
 27      * @param key 二进制密钥
 28      * @return key 密钥
 29      * @throws Exception
 30      */
 31     private static Key toKey(byte[] key) throws Exception{
 32         //实例化DES密钥材料
 33         DESKeySpec dks = new DESKeySpec(key);
 34         //实例化密钥工厂
 35         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
 36         //生产密钥
 37         SecretKey secretKey = keyFactory.generateSecret(dks);
 38         return secretKey;
 39     }
 40     /**
 41      * 解密
 42      * @param data 待解密数据
 43      * @param key 密钥
 44      * @return byte[] 解密数据
 45      * @throws Exception
 46      */
 47     public static byte[] decrypt(byte[] data,byte[] key) throws Exception{
 48         //还原密钥
 49         Key k = toKey(key);
 50         //实例化 
 51         Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
 52         //初始化,设置为解密模式
 53         cipher.init(Cipher.DECRYPT_MODE, k);
 54         //执行操作
 55         return cipher.doFinal(data);
 56     }
 57     /**
 58      * 加密
 59      * @param data 待加密数据
 60      * @param key 密钥
 61      * @return byte[] 加密数据
 62      * @throws Exception
 63      */
 64     public static byte[] encrypt(byte[] data,byte[] key) throws Exception{
 65         //还原密钥
 66         Key k = toKey(key);
 67         //实例化
 68         Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
 69         //初始化,设置为加密模式
 70         cipher.init(Cipher.ENCRYPT_MODE,k);
 71         //执行操作
 72         return cipher.doFinal(data);
 73     }
 74     /**
 75      * 生产密钥
 76      * java 7只支持56位 密钥
 77      * Bouncy Castle 支持64位密钥
 78      * @return byte[] 二进制密钥
 79      * @throws Exception
 80      */
 81     public static byte[] initKey() throws Exception{
 82         /*
 83          * 实例化密钥生成器
 84          * 若要使用64位密钥注意替换
 85          * 讲下述代码中的
 86          * KeyGenerator.getInstance(KEY_ALGORITHM);
 87          * 替换为
 88          * KeyGenerator.getInstance(KEY_ALGORITHM,"BC");
 89          */
 90         KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);
 91         /*
 92          * 初始化密钥生成器
 93          * 若要使用64位密钥注意替换
 94          * 将下述的代码 kg.init(56);
 95          * 替换为 kg.init(64);
 96          */
 97         kg.init(56);
 98         //生成密钥
 99         SecretKey secretKey = kg.generateKey();
100         //获得密钥的二进制编码形式
101         return secretKey.getEncoded();
102     }
103 }

单元测试:引入了三个包 commons-codec-1.9.jar    引入Base64.encodeBase64String(inputData)方法

            junit-4.11.jar  hamcrest-core-1.3.jar 进行单元测试

 1 package test;
 2 
 3 import org.apache.commons.codec.binary.Base64;
 4 import org.junit.Test;
 5 
 6 
 7 
 8 public class DESCoderTest {
 9     @Test
10     public  void test() throws Exception{
11         String inputStr = "DES";
12         byte[] inputData = inputStr.getBytes();
13         System.out.println("原文:\t" + inputStr);
14         //初始化密钥
15         byte[] key = DESCoder.initKey();
16         System.out.println("密钥:\t" + Base64.encodeBase64String(key));
17         //加密
18         inputData = DESCoder.encrypt(inputData, key);
19         System.out.println("加密后:\t" + Base64.encodeBase64String(inputData));
20         //解密
21         byte[] outputDate = DESCoder.decrypt(inputData, key);
22         String outoutStr = new String(outputDate);
23         System.out.println("解密后:\t" + outoutStr);
24     }
25 }

输出:  

  原文: DES
  密钥: x8TN3Ku8/iM=
  加密后: lOAZ+WcFAEU=
  解密后: DES

posted on 2016-09-05 17:15  沐浴春风  阅读(2750)  评论(0编辑  收藏  举报