JAVA md5把我气到疯的代码,天哪,神呀,我的C# 啊。
以下代码是客户写给我的,说是他们JAVA的加密方法,其中红色的那两句差点把我整垮了。
Java人士说:content是明文 key是密钥,用密钥来加密明文。
C#认识说:什么明文密钥一起丢进去,所以只需要 content+key 丢到computehash(...)一切尽在转化中。。。。
private static String getDigest(String content, String key, String algorithm) {
try {
byte[] plainText = content.getBytes("utf-8");
MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
messageDigest.update(plainText);
byte[] digest = messageDigest.digest(key.getBytes("utf-8"));
return byte2hex(digest);
} catch (NoSuchAlgorithmException ex) {
Debug.error("Error digest algorithm: " + algorithm);
} catch (UnsupportedEncodingException e) {
Debug.error("Error digest algorithm: " + algorithm);
}
return null;
}
private static String byte2hex(byte[] b) {
StringBuilder hs = new StringBuilder();
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1) {
hs.append("0" + stmp);
} else {
hs.append(stmp);
}
}
return hs.toString();
}
红色部分其实就是:
messageDigest.update(plainText);
messageDigest.update(key.getBytes("utf-8"));
byte[] digest = messageDigest.digest();
可恶的是本人就没有学过JAVA,看了三遍的JDK说明,无解,
最后才看到了
SHA-1 例子:
现在有i1、i2和i3,分别是3个字节数组,构成一个消息,计算其散列函数值:
MessageDigest sha1 = MessageDigest.getInstance(“sha-1”);
sha1.Update(i1);
sha1.Update(i2);
sha1.Update(i3);
byte[] hash = sha1.digest();
对digest方法的调用则说明输入消息结束。进行初始化,update提交的数据丢失。Digest方法也可以把输入的最后一部分作为参数:
看到这里我真的想哭。原来就是字符串的一个叠加,搞得我想死。我一直以为这两个函数功能是不一样的。鬼才晓得后面这个
digest(byte[]),其实和Update是一样的。
sha1.Update(i1);
sha1.Update(i2);
byte[] hash = sha1.digest(i3);
在一些散列函数实现中,可以通过复制(clone)来获得中间散列数值。如:
要分别计算:i1,i1和i2,i1、i2和i3的散列数值。
//计算i1 hash
sha1.update(i1);
byte[] i1Hash = sha1.clone().digest();
//计算i1和i2 hash
sha1.update(i2);
byte[] i12Hash = sha1.clone().digest();
//计算i1、i2和i3 hash
sha1.update(i3);
byte[] i123Hash = sha1.digest();
太感谢上苍了。
2
3 //16位
4
5 public static string GetMd5(string str)
6 {
7 System.Security.Cryptography.MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
8 string a = BitConverter.ToString(md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(str)), 4, 8);
9 a = a.Replace("-", "");
10 return a;
11 }
12
13 //32位
15 public static string GetMd51(string str)
16 {
17 System.Security.Cryptography.MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
18 string a = BitConverter.ToString(md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(str)));
19 a = a.Replace("-", "");
20 return a;
21 }
22
23 //方法2:
24
25 public static string Hash(string toHash)
26 {
27 MD5CryptoServiceProvider crypto = new MD5CryptoServiceProvider();
28 byte[] bytes = Encoding.UTF8.GetBytes(toHash);
29 bytes = crypto.ComputeHash(bytes);
30 StringBuilder sb = new StringBuilder();
31 foreach (byte num in bytes)
32 {
33 sb.AppendFormat("{0:x2}", num);
34 }
35 return sb.ToString(); //32位
36 return sb.ToString().Substring(8, 16); //16位
37 }
Java加密出来的是900cb2d97c87b750fd1adafbb322fa45
C#加密出来的是:900cb2d97c87b750fd1adafbb322fa45
请继续参考http://www.jeanwen.com/blog/page/82
写的很好。