C#实现HMAC

程序代码 程序代码

using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;

namespace eName.Payment
{
    public class HMAC
    {
        private string Fun_MD5(string str)
        {
            byte[] b = Encoding.GetEncoding(1252).GetBytes(str);
            b = new MD5CryptoServiceProvider().ComputeHash(b);
            string ret = string.Empty;
            foreach (int i in b)
            {
                ret += i.ToString("x").PadLeft(2, '0');
            }
            return ret;
        }
        private byte[] HexStringToArray(string HexStr)
        {
            string HEX = "0123456789ABCDEF";
            string str = HexStr.ToUpper();
            int len = str.Length;
            byte[] retByte = new byte[len / 2];
            for (int i = 0; i < len / 2; i++)
            {
                int NumHigh = HEX.IndexOf(str[i * 2]);
                int NumLow = HEX.IndexOf(str[i * 2 + 1]);
                retByte[i] = Convert.ToByte(NumHigh * 16 + NumLow);
            }
            return retByte;
        }
        private string StrXor(string password, string pad)
        {
            string iResult = string.Empty;
            int KLen = password.Length;

            for (int i = 0; i < 64; i++)
            {
                if (i < KLen)
                    iResult += Convert.ToChar(pad[i] ^ password[i]);
                else
                    iResult += Convert.ToChar(pad[i]);
            }
            return iResult;
        }
        public string Maker(string data, string password)
        {
            string k_ipad, k_opad, temp;
            string ipad = "6666666666666666666666666666666666666666666666666666666666666666";
            string opad = @"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\";
            k_ipad = Fun_MD5(StrXor(password, ipad) + data);

            k_opad = StrXor(password, opad);

            byte[] Test = HexStringToArray(k_ipad);
            temp = string.Empty;

            char[] b = Encoding.GetEncoding(1252).GetChars(Test);
            for (int i = 0; i < b.Length; i++)
            {
                temp += b[i];
            }
            temp = k_opad + temp;
            return Fun_MD5(temp).ToLower();
        }
    }
}




[本日志由 岸上的鱼 于 2009-03-25 04:30 PM 编辑]
文章来自: Alocne
引用通告: 查看所有引用 | 我要引用此文章
Tags: C# .NET HMAC
评论: 0 | 引用: 0 | 查看次数: 3546
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 邮件地址支持Gravatar头像,邮箱地址不会公开.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭