using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
namespace EastChanger
{
public static class SignUtil
{
///
/// sign生成
///
///
///
///
public static string BuildSign(Dictionary paramsMap, string secret)
{
//var keySet = paramsMap.Keys;
List paramNames = paramsMap.Keys.ToList();
paramNames.Sort();
StringBuilder paramNameValue = new StringBuilder();
foreach (var paramName in paramNames)
{
paramNameValue.Append(paramName).Append(paramsMap[paramName]);
}
string source = secret + paramNameValue.ToString() + secret;
return ToMD5(source);
}
///
/// MD加密
///
///
///
public static string ToMD5(string message)
{
try
{
// 1 创建一个提供信息摘要算法的对象,初始化为md5算法对象
MD5 md5 = new MD5CryptoServiceProvider();
// 2 将消息变成byte数组
byte[] input = Encoding.UTF8.GetBytes(message);
// 3 计算后获得字节数组,这就是那128位了
byte[] buff = md5.ComputeHash(input);
// 4 把数组每一字节(一个字节占八位)换成16进制连成md5字符串
return Byte2hex(buff);
}
catch (Exception e)
{
throw e;
}
}
private static string Byte2hex(byte[] bytes)
{
//创建一个StringBuilder对象来存储最终的结果
StringBuilder sign = new StringBuilder();
//使用for循环遍历字节数组中的每个字节
for (int i = 0; i < bytes.Length; i++)
{
// 将字节强制转换为整数,并对其进行位运算,即保留后八位的值,并转换为十六进制形式的字符串
string hex = bytes[i].ToString("x2");
// 如果转换后的字符串长度为1,即只有1位,则在前面添加一个0,以保证每个字节都是两位十六进制数
if (hex.Length == 1)
{
sign.Append("0");
}
// 将转换后的字符串追加到StringBuilder对象中,并转换为大写形式
sign.Append(hex.ToUpper());
}
return sign.ToString();
}
public static string UrlEncode(string str)
{
StringBuilder sb = new StringBuilder();
byte[] byStr = System.Text.Encoding.UTF8.GetBytes(str); //默认是System.Text.Encoding.Default.GetBytes(str)
for (int i = 0; i < byStr.Length; i++)
{
sb.Append(@"%" + Convert.ToString(byStr[i], 16));
}
return (sb.ToString());
}
}
}