public string rspauth(string Username, string Realm, string Password, string Nonce, string Cnonce,
  string m_Authzid, string m_DigestUri, string Qop, string m_Nc)
   {
       //          HEX( KD ( HEX(H(A1)),
       //              { nonce-value, ":" nc-value, ":",
       //                cnonce-value, ":", qop-value, ":", HEX(H(A2)) }))

       //If authzid is specified, then A1 is

       //   A1 = { H( { username-value, ":", realm-value, ":", passwd } ),
       //        ":", nonce-value, ":", cnonce-value, ":", authzid-value }

       //If authzid is not specified, then A1 is

       //   A1 = { H( { username-value, ":", realm-value, ":", passwd } ),
       //        ":", nonce-value, ":", cnonce-value }

       //         The server receives and validates the "digest-response". The server
       //checks that the nonce-count is "00000001". If it supports subsequent
       //authentication (see section 2.2), it saves the value of the nonce and
       //the nonce-count. It sends a message formatted as follows:

       // response-auth = "rspauth" "=" response-value

       //where response-value is calculated as above, using the values sent in
       //step two, except that if qop is "auth", then A2 is

       //    A2 = { ":", digest-uri-value }

       //And if qop is "auth-int" or "auth-conf" then A2 is

       //    A2 = { ":", digest-uri-value, ":00000000000000000000000000000000" }

       byte[] H1;
       byte[] H2;
       byte[] H3;

       // byte[] temp;
       string A1;
       string A2;
       string A3;
       string p1;
       string p2;

       var sb = new StringBuilder();
       sb.Append(Username);
       sb.Append(":");
       sb.Append(Realm);
       sb.Append(":");
       sb.Append(Password);

       H1 = new MD5CryptoServiceProvider().ComputeHash(Encoding.UTF8.GetBytes(sb.ToString()));

       sb.Remove(0, sb.Length);
       sb.Append(":");
       sb.Append(Nonce);
       sb.Append(":");
       sb.Append(Cnonce);

       if (m_Authzid != null)
       {
           sb.Append(":");
           sb.Append(m_Authzid);
       }

       A1 = sb.ToString();

       byte[] bA1 = Encoding.ASCII.GetBytes(A1);
       var bH1A1 = new byte[H1.Length + bA1.Length];

       // Array.Copy(H1, bH1A1, H1.Length);
       Array.Copy(H1, 0, bH1A1, 0, H1.Length);
       Array.Copy(bA1, 0, bH1A1, H1.Length, bA1.Length);

       H1 = new MD5CryptoServiceProvider().ComputeHash(bH1A1);

       // Console.WriteLine(util.Hash.HexToString(H1));

       sb.Remove(0, sb.Length);
       sb.Append(":");
       sb.Append(m_DigestUri);
       //if (Qop.CompareTo("auth") != 0)
       //{
       //    sb.Append(":00000000000000000000000000000000");
       //}

       A2 = sb.ToString();
       //H2 = Encoding.ASCII.GetBytes(A2);
       H2 = Encoding.UTF8.GetBytes(A2);

       H2 = new MD5CryptoServiceProvider().ComputeHash(H2);

       // create p1 and p2 as the hex representation of H1 and H2
       p1 = Hash.HexToString(H1).ToLower();
       p2 = Hash.HexToString(H2).ToLower();

       sb.Remove(0, sb.Length);
       sb.Append(p1);
       sb.Append(":");
       sb.Append(Nonce);
       sb.Append(":");
       sb.Append(m_Nc);
       sb.Append(":");
       sb.Append(Cnonce);
       sb.Append(":");
       sb.Append(Qop);
       sb.Append(":");
       sb.Append(p2);

       A3 = sb.ToString();

       H3 = new MD5CryptoServiceProvider().ComputeHash(Encoding.UTF8.GetBytes(A3));

       var m_Response = Hash.HexToString(H3).ToLower();
       return m_Response;
   }

string.Format("rspauth={0}",的更多相关文章

  1. C#:String.Format数字格式化输出 {0:N2} {0:D2} {0:C2}等等

    int a = 12345678; //格式为sring输出//   Label1.Text = string.Format("asdfadsf{0}adsfasdf",a); / ...

  2. String.Format数字格式化输出 {0:N2} {0:D2} {0:C2

    //格式为sring输出 //   Label1.Text = string.Format("asdfadsf{0}adsfasdf",a); //   Label2.Text = ...

  3. 【转】C# String.Format数字格式化输出各种转换{0:N2} {0:D2} {0:C2}...

    ; //格式为sring输出 // Label1.Text = string.Format("asdfadsf{0}adsfasdf",a); // Label2.Text = & ...

  4. C#:String.Format数字格式化输出 {0:N2} {0:D2} {0:C2}...

    int a = 12345678; //格式为sring输出//   Label1.Text = string.Format("asdfadsf{0}adsfasdf",a);// ...

  5. String.Format数字格式化输出 {0:N2} {0:D2} {0:C2} (转)

    String.Format数字格式化输出 {:N2} {:D2} {:C2} (转) //格式为sring输出 // Label1.Text = string.Format("asdfads ...

  6. c#字符显示转换{0:d} string.Format()

    这一篇实际和前几个月写的没什么本质上的区别.但是这篇更明确一点,学起来easy c#字符显示转换{0:d} C#:String.Format数字格式化输出 : int a = 12345678; // ...

  7. C# String.Format格式化json字符串中包含"{" "}"报错问题

    json.Append(String.Format("{\"total\":{0},\"row\":{1}}", lineCount, st ...

  8. $是对string.Format的简化

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. 如何在string.Format()方法中输出大括号

    在string.Format参数中,大括号{}是有特殊意义的符号,但是如果我们希望最终的结果中包含大括号({}),那么我们需要怎么做呢?是”\{”吗?很遗憾,运行时,会给你一个Exception的!正 ...

随机推荐

  1. highchart 曲线图

    $(function() { Highcharts.setOptions({ global: { useUTC: false } }); var chart = new Highcharts.Char ...

  2. String.getBytes()[转]

    在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组.这个表示在不通OS下,返回的东西不一样! String.getBytes(String decode)方 ...

  3. [C++] Lvalue and Rvalue Reference

    Lvalue and Rvalue Reference int a = 10;// a is in stack int& ra = a; // 左值引用 int* && pa ...

  4. jquery删除记录弹出提示框

    来自于<jquery权威指南> ------------------- 点击删除时,弹出提示框,并做相应的删除确定或取消 完整代码如下: <!DOCTYPE html PUBLIC ...

  5. xgboost 里边的gain freq, cover

    assuming that you're using xgboost to fit boosted trees for binary classification. The importance ma ...

  6. Python with yield语句

    1.with 语句 语法: with expression as variable 需要引入一个上下文管理协议,实现的方法是为一个类定义 __enter__() 和 __exit__() 方法, 在执 ...

  7. mysql json格式数据处理

    1.查询字段所对应的值: SELECT c.result_http->"$.create_time",json_extract(c.result_http,"$.e ...

  8. Python3+Apache+Django+CentOS

    使用django开发的项目上到正式环境的环境搭建,系统软件版本: CentOS6. setuptools-.tar.gz pip-.tar.gz Python-.tgz pcre-8.39.tar.b ...

  9. ssh的配置[待写]

    开机自启:/etc/rc.local /etc/init.d/ssh start 将 /etc/ssh/sshd_confg中PermitRootLogin no 改为yes,重新启动ssh服务.

  10. How do I avoid capturing self in blocks when implementing an API?

    Short answer Instead of accessing self directly, you should access it indirectly, from a reference t ...