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)),  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

写的很好。

 

 

转载于:https://www.cnblogs.com/mishy/archive/2011/04/27/2030287.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值