.
.
.
.
.
花了一个多小时的时间整理了原来一直使用的 MD5 加密类,这次新添加了 Salt 二次 MD5 加密模块。
核心的方法 cell32() 是很久以前在网上找来的,因为不记得原作者和出处了,所以没有贴出来版权,如果您是该方法的作者,请联系我,我将会及时附上版权。
由于本人水平有限,如果各位有更好的算法还请多多指教。
以下是完整代码:
1 package cn.lastcc.publicTools;
2
3 import java.security.MessageDigest;
4 import java.security.NoSuchAlgorithmException;
5
6 /**
7 * Salt MD5 加强模块<br>
8 * 提供 16 位与 32 位 MD5 加密与其 Salt 加密功能<p>
9 *
10 * Salt 加密方法调用:<br>
11 * MD5 md5 = new MD5();<br>
12 * String [] _tmp = md5.salt32("明文"); <br>
13 System.out.println(_tmp[0] + "\t" + _tmp[1]);
14 *
15 * @author Programer.Monkey<br>
16 * Email: Programer.Monkey@gmail.com
17 *
18 * @version 11.12.30.1
19 *
20 */
21 public class MD5 {
22
23 /**
24 * 随机密钥长度
25 */
26 private static final int _KEYTLENGTH = 6;
27
28 public MD5() {
29 }
30
31 /**
32 * 生成随机密钥
33 *
34 * @param length
35 * 密钥长度
36 */
37 private String getRandomKeyt(int length) throws Exception {
38 if (length < 1)
39 throw new Exception("密钥长度不能小于 1");
40 String _keyt = "";
41 for (int i = 0; i < length; i++) {
42 _keyt += (char) (33 + (int) (Math.random() * (126 - 33 + 1)));
43 }
44 return _keyt;
45 }
46
47 /**
48 * 32位标准 MD5 加密
49 *
50 * @param plainText
51 * 明文
52 * @return 密文<br>
53 * 返回 Null 值则出现异常
54 */
55 public String cell32(String plainText) {
56 try {
57 MessageDigest md = MessageDigest.getInstance("MD5");
58 md.update(plainText.getBytes());
59 byte b[] = md.digest();
60 int i;
61 StringBuffer buf = new StringBuffer("");
62 for (int offset = 0; offset < b.length; offset++) {
63 i = b[offset];
64 if (i < 0)
65 i += 256;
66 if (i < 16)
67 buf.append("0");
68 buf.append(Integer.toHexString(i));
69 }
70 return buf.toString();// 32位的加密
71
72 } catch (NoSuchAlgorithmException e) {
73 e.printStackTrace();
74 }
75 return null;
76 }
77
78 /**
79 * 32 位 salt 加密
80 *
81 * @param plainText
82 * 明文
83 * @return 索引 0 是密文,索引 1 是二次密钥
84 */
85 public String[] salt32(String plainText) throws Exception {
86 return salt("cell32", plainText);
87 }
88
89 /**
90 * 16 位标准 MD5 加密
91 *
92 * @param plainText
93 * 明文
94 * @return 密文<br>
95 * 返回 Null 值则出现异常
96 */
97 public String cell16(String plainText) {
98 String result = cell32(plainText);
99 if (result == null)
100 return null;
101 return result.toString().substring(8, 24);// 16位的加密
102 }
103
104 /**
105 * 16 位 salt 加密
106 *
107 * @param plainText
108 * 明文
109 * @return 索引 0 是密文,索引 1 是二次密钥
110 */
111 public String[] salt16(String plainText) throws Exception {
112 return salt("cell16", plainText);
113 }
114
115 /**
116 * 根据调用的方法名称执行不同的方法
117 *
118 * @param saltFunctionName
119 * 加密的方法名称
120 */
121 private String[] salt(String saltFunctionName, String plainText)
122 throws Exception {
123 String _keyt = getRandomKeyt(_KEYTLENGTH);
124 return new String[] {(String) this.getClass().getMethod(saltFunctionName, Class.forName("java.lang.String")).invoke(this, (cell32(plainText) + _keyt)), _keyt };
125 }
126 }
以下是调用 Salt 算法的方法:
1 String [] tmp = ((MD5)Class.forName("cn.lastcc.publicTools.MD5").newInstance()).salt32("abcdef");