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("原文: " + inputStr); 14 //初始化密钥 15 byte[] key = DESCoder.initKey(); 16 System.out.println("密钥: " + Base64.encodeBase64String(key)); 17 //加密 18 inputData = DESCoder.encrypt(inputData, key); 19 System.out.println("加密后: " + Base64.encodeBase64String(inputData)); 20 //解密 21 byte[] outputDate = DESCoder.decrypt(inputData, key); 22 String outoutStr = new String(outputDate); 23 System.out.println("解密后: " + outoutStr); 24 } 25 }
输出:
原文: DES
密钥: x8TN3Ku8/iM=
加密后: lOAZ+WcFAEU=
解密后: DES