• 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

    写的很好。

     

     

  • 相关阅读:
    高斯 约旦消元法
    取模运算相关的常数优化
    数论同余学习笔记 Part 3
    异或相关的杂题
    数论同余学习笔记 Part 1
    杂题乱做(一)
    c++优先队列(priority_queue)用法详解
    https://lyxw.xyz
    [题目] Luogu P3707 [SDOI2017]相关分析
    [笔记]Splay&Treap&FhqTreap
  • 原文地址:https://www.cnblogs.com/mishy/p/2030287.html
Copyright © 2020-2023  润新知