对称加密算法
http://www.javaeye.com/wiki/security/1712-symmetric-encryption-algorithm 原创作者: snowolf 阅读:1232次 评论:0条 更新时间:2009-05-26 DES DES-Data Encryption Standard,即数据加密算法。是IBM公司于1975年研究成功并公开发表的。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。
DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位。
通过java代码实现如下:Coder类见 单向加密算法 Java代码
1. 2. 3. 4. 5. 6. 7. 8. 9.
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator; import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec;
10. 11. /**
12. * DES安全编码组件 13. *
14. *
15. * 支持 DES、DESede(TripleDES,就是3DES)、AES、Blowfish、RC2、RC4(ARCFOUR) 16. * DES key size must be equal to 5624. *17. * DESede(TripleDES) key size must be equal to 112 or 168
18. * AES key size must be equal to 128, 192 or 256,but 19
2 and 256 bits may not be available
19. * Blowfish key size must be multiple of 8, and can only ran
ge from 32 to 448 (inclusive)
20. * RC2 key size must be between 40 and 1024 bits 21. * RC4(ARCFOUR) key size must be between 40 and 1024 bits 22. * 具体内容 需要关
注 JDK Document http://.../docs/technotes/guides/security/SunProviders.html
23. *
25. * @author 梁栋 26. * @version 1.0 27. * @since 1.0 28. */
29. public abstract class DESCoder extends Coder { 30. /**
31. * ALGORITHM 算法
32. * 可替换为以下任意一种算法,同时key值的size相应改变。 33. *
34. *
42. *35. * DES key size must be equal to 56
36. * DESede(TripleDES) key size must be equal to 112 or 168
37. * AES key size must be equal to 128, 192 or 256,bu
t 192 and 256 bits may not be available
38. * Blowfish key size must be multiple of 8, and can only
range from 32 to 448 (inclusive)
39. * RC2 key size must be between 40 and 1024 bits 40. * RC4(ARCFOUR) key size must be between 40 and 1024 bits 41. *
43. * 在Key toKey(byte[] key)方法中使用下述代码
44. * 46. * DESKeySpec dks = new DESKeySpec(key); 47. * SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORI THM); 48. * SecretKey secretKey = keyFactory.generateSecret(dks); 49. * 51. public static final String ALGORITHM = \"DES\"; 52. 53. /** 54. * 转换密钥 56. * @param key 57. * @return 58. * @throws Exception 59. */ 60. private static Key toKey(byte[] key) throws Exception { 61. DESKeySpec dks = new DESKeySpec(key); 62. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGOR ITHM); 63. SecretKey secretKey = keyFactory.generateSecret(dks); 64. 65. // 当使用其他对称加密算法时,如AES、Blowfish等算法时,用下述代码 替换上述三行代码 66. // SecretKey secretKey = new SecretKeySpec(key, ALGORITHM); 67. 68. return secretKey; 69. } 70. 71. /** 72. * 解密 73. * 74. * @param data 75. * @param key 76. * @return 77. * @throws Exception 78. */ 79. public static byte[] decrypt(byte[] data, String key) throws Excepti on { 80. Key k = toKey(decryptBASE64(key)); 81. 82. Cipher cipher = Cipher.getInstance(ALGORITHM); 83. cipher.init(Cipher.DECRYPT_MODE, k); 84. 85. return cipher.doFinal(data); 86. } 87. 88. /** 89. * 加密 90. * 91. * @param data 92. * @param key 93. * @return 94. * @throws Exception 95. */ 96. public static byte[] encrypt(byte[] data, String key) throws Excepti on { 97. Key k = toKey(decryptBASE64(key)); 98. Cipher cipher = Cipher.getInstance(ALGORITHM); 99. cipher.init(Cipher.ENCRYPT_MODE, k); 100. 101. return cipher.doFinal(data); 102. } 103. 104. /** 105. * 生成密钥 106. * 107. * @return 108. * @throws Exception 109. */ 110. public static String initKey() throws Exception { 111. return initKey(null); 112. } 113. 114. /** 115. * 生成密钥 116. * 117. * @param seed 118. * @return 119. * @throws Exception 120. */ 121. public static String initKey(String seed) throws Exception { 122. SecureRandom secureRandom = null; 123. 124. if (seed != null) { 125. secureRandom = new SecureRandom(decryptBASE64(seed)); 126. } else { 127. secureRandom = new SecureRandom(); 128. } 129. 130. KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM); 131. kg.init(secureRandom); 132. 133. SecretKey secretKey = kg.generateKey(); 134. 135. return encryptBASE64(secretKey.getEncoded()); 136. } 137. } 延续上一个类的实现,我们通过MD5以及SHA对字符串加密生成密钥,这是比较常见的密钥生成方式。 再给出一个测试类: Java代码 1. import static org.junit.Assert.*; 2. 3. import org.junit.Test; 4. 5. /** 6. * 7. * @author 梁栋 8. * @version 1.0 9. * @since 1.0 10. */ 11. public class DESCoderTest { 12. 13. @Test 14. public void test() throws Exception { 15. String inputStr = \"DES\"; 16. String key = DESCoder.initKey(); 17. System.err.println(\"原文:\\" + inputStr); 18. 19. System.err.println(\"密钥:\\" + key); 20. 21. byte[] inputData = inputStr.getBytes(); 22. inputData = DESCoder.encrypt(inputData, key); 23. 24. System.err.println(\"加密 后:\\" + DESCoder.encryptBASE64(inputData)); 25. 26. byte[] outputData = DESCoder.decrypt(inputData, key); 27. String outputStr = new String(outputData); 28. 29. System.err.println(\"解密后:\\" + outputStr); 30. 31. assertEquals(inputStr, outputStr); 32. } 33. } 得到的输出内容如下: Console代码 1. 2. 3. 4. 5. 6. 原文: DES 密钥: f3wEtRrV6q0= 加密后: C6qe9oNIzRY= 解密后: DES 由控制台得到的输出,我们能够比对加密、解密后结果一致。这是一种简单的加密解密方式,只有一个密钥。 其实DES有很多同胞兄弟,如DESede(TripleDES)、AES、Blowfish、RC2、RC4(ARCFOUR)。这里就不过多阐述了,大同小异,只要换掉ALGORITHM换成对应的值,同时做一个代码替换SecretKey secretKey = new SecretKeySpec(key, ALGORITHM);就可以了,此外就是密钥长度不同了。 Java代码 1. 2. 3. 4. 5. 6. 7. 8. /** * DES key size must be equal to 56 * DESede(TripleDES) key size must be equal to 112 or 168 * AES key size must be equal to 128, 192 or 256,but 192 and 256 bits may not be available * Blowfish key size must be multiple of 8, and can only range from 32 to 448 (inclusive) * RC2 key size must be between 40 and 1024 bits * RC4(ARCFOUR) key size must be between 40 and 1024 bits **/ 因篇幅问题不能全部显示,请点此查看更多更全内容SecretKey secretKey = new SecretKeySpec(key, ALGORITHM);ode> 替换 45. *
50. */
55. *