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();

 

 

太感谢上苍了。

 

 1         //方法1:
 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)), 48);
 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(816);        //16位
37         }

 

 

Java加密出来的是900cb2d97c87b750fd1adafbb322fa45

C#加密出来的是:900cb2d97c87b750fd1adafbb322fa45 

请继续参考http://www.jeanwen.com/blog/page/82

写的很好。

 

 

posted @ 2011-04-27 13:17  笑萧亦然  阅读(1021)  评论(0编辑  收藏  举报