您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页对称加密算法

对称加密算法

来源:意榕旅游网


对称加密算法

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 56

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. *

24. *

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. *

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. *

42. *

43. * 在Key toKey(byte[] key)方法中使用下述代码

44. * SecretKey secretKey = new SecretKeySpec(key, ALGORITHM);ode> 替换 45. *

46. * DESKeySpec dks = new DESKeySpec(key);

47. * SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORI

THM);

48. * SecretKey secretKey = keyFactory.generateSecret(dks); 49. * 50. */

51. public static final String ALGORITHM = \"DES\"; 52.

53. /**

54. * 转换密钥
55. *

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 **/

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务