当前位置:   article > 正文

C# 实现Base64+MD5 加密(整理)_c# md5 加密 base64 编码

c# md5 加密 base64 编码
  1. //加密方法
  2.  public class Md5Base64
  3. {
  4. public static string encode(String str)
  5. {
  6. Base64Encoder base64 = new Base64Encoder();
  7. var ss = (byte[])MD5.md5(str, true, Encoding.UTF8);
  8. return base64.GetEncoded((byte[])MD5.md5(str, true, Encoding.UTF8));
  9. }
  10. }
  11. public class MD5
  12. {
  13. // 格式化md5 hash 字节数组所用的格式(两位小写16进制数字)
  14. private static readonly string m_strHexFormat = "x2";
  15. private MD5() { }
  16. /// <summary>
  17. /// 使用当前缺省的字符编码对字符串进行加密
  18. /// </summary>
  19. /// <param name="str">需要进行md5演算的字符串</param>
  20. /// <returns>用小写字母表示的32位16进制数字字符串</returns>
  21. public static string md5(string str)
  22. {
  23. return (string)md5(str, false, Encoding.Default);
  24. }
  25. /// <summary>
  26. /// 对字符串进行md5 hash计算
  27. /// </summary>
  28. /// <param name="str">需要进行md5演算的字符串</param>
  29. /// <param name="raw_output">
  30. /// false则返回经过格式化的加密字符串(等同于 string md5(string) )
  31. /// true则返回原始的md5 hash 长度16 的 byte[] 数组
  32. /// </param>
  33. /// <returns>
  34. /// byte[] 数组或者经过格式化的 string 字符串
  35. /// </returns>
  36. public static object md5(string str, bool raw_output)
  37. {
  38. return md5(str, raw_output, Encoding.Default);
  39. }
  40. /// <summary>
  41. /// 对字符串进行md5 hash计算
  42. /// </summary>
  43. /// <param name="str">需要进行md5演算的字符串</param>
  44. /// <param name="raw_output">
  45. /// false则返回经过格式化的加密字符串(等同于 string md5(string) )
  46. /// true则返回原始的md5 hash 长度16 的 byte[] 数组
  47. /// </param>
  48. /// <param name="charEncoder">
  49. /// 用来指定对输入字符串进行编解码的 Encoding 类型,
  50. /// 当输入字符串中包含多字节文字(比如中文)的时候
  51. /// 必须保证进行匹配的 md5 hash 所使用的字符编码相同,
  52. /// 否则计算出来的 md5 将不匹配。
  53. /// </param>
  54. /// <returns>
  55. /// byte[] 数组或者经过格式化的 string 字符串
  56. /// </returns>
  57. public static object md5(string str, bool raw_output,
  58. Encoding charEncoder)
  59. {
  60. if (!raw_output)
  61. return md5str(str, charEncoder);
  62. else
  63. return md5raw(str, charEncoder);
  64. }
  65. /// <summary>
  66. /// 使用当前缺省的字符编码对字符串进行加密
  67. /// </summary>
  68. /// <param name="str">需要进行md5演算的字符串</param>
  69. /// <returns>用小写字母表示的32位16进制数字字符串</returns>
  70. protected static string md5str(string str)
  71. {
  72. return md5str(str, Encoding.Default);
  73. }
  74. /// <summary>
  75. /// 对字符串进行md5加密
  76. /// </summary>
  77. /// <param name="str">需要进行md5演算的字符串</param>
  78. /// <param name="charEncoder">
  79. /// 指定对输入字符串进行编解码的 Encoding 类型
  80. /// </param>
  81. /// <returns>用小写字母表示的32位16进制数字字符串</returns>
  82. protected static string md5str(string str, Encoding charEncoder)
  83. {
  84. byte[] bytesOfStr = md5raw(str, charEncoder);
  85. int bLen = bytesOfStr.Length;
  86. StringBuilder pwdBuilder = new StringBuilder(32);
  87. for (int i = 0; i < bLen; i++)
  88. {
  89. pwdBuilder.Append(bytesOfStr[i].ToString(m_strHexFormat));
  90. }
  91. return pwdBuilder.ToString();
  92. }
  93. /// <summary>
  94. /// 使用当前缺省的字符编码对字符串进行加密
  95. /// </summary>
  96. /// <param name="str">需要进行md5演算的字符串</param>
  97. /// <returns>长度16 的 byte[] 数组</returns>
  98. protected static byte[] md5raw(string str)
  99. {
  100. return md5raw(str, Encoding.Default);
  101. }
  102. /// <summary>
  103. /// 对字符串进行md5加密
  104. /// </summary>
  105. /// <param name="str">需要进行md5演算的字符串</param>
  106. /// <param name="charEncoder">
  107. /// 指定对输入字符串进行编解码的 Encoding 类型
  108. /// </param>
  109. /// <returns>长度16 的 byte[] 数组</returns>
  110. protected static byte[] md5raw(string str, Encoding charEncoder)
  111. {
  112. System.Security.Cryptography.MD5 md5 =
  113. System.Security.Cryptography.MD5.Create();
  114. return md5.ComputeHash(charEncoder.GetBytes(str));
  115. }
  116. }
  117. /// <summary>
  118. /// Base64编码类。
  119. /// 将byte[]类型转换成Base64编码的string类型。
  120. /// </summary>
  121. public class Base64Encoder
  122. {
  123. byte[] source;
  124. int length, length2;
  125. int blockCount;
  126. int paddingCount;
  127. public static Base64Encoder Encoder = new Base64Encoder();
  128. public Base64Encoder()
  129. {
  130. }
  131. private void init(byte[] input)
  132. {
  133. source = input;
  134. length = input.Length;
  135. if ((length % 3) == 0)
  136. {
  137. paddingCount = 0;
  138. blockCount = length / 3;
  139. }
  140. else
  141. {
  142. paddingCount = 3 - (length % 3);
  143. blockCount = (length + paddingCount) / 3;
  144. }
  145. length2 = length + paddingCount;
  146. }
  147. public string GetEncoded(byte[] input)
  148. {
  149. //初始化
  150. init(input);
  151. byte[] source2;
  152. source2 = new byte[length2];
  153. for (int x = 0; x < length2; x++)
  154. {
  155. if (x < length)
  156. {
  157. source2[x] = source[x];
  158. }
  159. else
  160. {
  161. source2[x] = 0;
  162. }
  163. }
  164. byte b1, b2, b3;
  165. byte temp, temp1, temp2, temp3, temp4;
  166. byte[] buffer = new byte[blockCount * 4];
  167. char[] result = new char[blockCount * 4];
  168. for (int x = 0; x < blockCount; x++)
  169. {
  170. b1 = source2[x * 3];
  171. b2 = source2[x * 3 + 1];
  172. b3 = source2[x * 3 + 2];
  173. temp1 = (byte)((b1 & 252) >> 2);
  174. temp = (byte)((b1 & 3) << 4);
  175. temp2 = (byte)((b2 & 240) >> 4);
  176. temp2 += temp;
  177. temp = (byte)((b2 & 15) << 2);
  178. temp3 = (byte)((b3 & 192) >> 6);
  179. temp3 += temp;
  180. temp4 = (byte)(b3 & 63);
  181. buffer[x * 4] = temp1;
  182. buffer[x * 4 + 1] = temp2;
  183. buffer[x * 4 + 2] = temp3;
  184. buffer[x * 4 + 3] = temp4;
  185. }
  186. for (int x = 0; x < blockCount * 4; x++)
  187. {
  188. result[x] = sixbit2char(buffer[x]);
  189. }
  190. switch (paddingCount)
  191. {
  192. case 0: break;
  193. case 1: result[blockCount * 4 - 1] = '='; break;
  194. case 2: result[blockCount * 4 - 1] = '=';
  195. result[blockCount * 4 - 2] = '=';
  196. break;
  197. default: break;
  198. }
  199. return new string(result);
  200. }
  201. private char sixbit2char(byte b)
  202. {
  203. char[] lookupTable = new char[64]{
  204. 'A','B','C','D','E','F','G','H','I','J','K','L','M',
  205. 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
  206. 'a','b','c','d','e','f','g','h','i','j','k','l','m',
  207. 'n','o','p','q','r','s','t','u','v','w','x','y','z',
  208. '0','1','2','3','4','5','6','7','8','9','+','/'};
  209. if ((b >= 0) && (b <= 63))
  210. {
  211. return lookupTable[(int)b];
  212. }
  213. else
  214. {
  215. return ' ';
  216. }
  217. }
  218. }


使用方法:

var y =  "<order></order>123456";

Md5Base64.encode(y)=》结果返回LghTkEmsD2tbQ3fsIBRcBg==

另外一种更简单的方法:

  1. var y = "<order></order>123456";
  2. using (var md5 = MD5.Create())
  3. {
  4. // MD5ハッシュ値を求める
  5. var md5hash = md5.ComputeHash(Encoding.UTF8.GetBytes(y));
  6. // もとめたハッシュ値をBASE64に変換する
  7. var md5hash_base64 = Convert.ToBase64String(md5hash);
  8. Response.Write(md5hash_base64);
  9. }

http://simeon.blog.51cto.com/18680/217051/ 解密和加密原理。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/730838
推荐阅读
相关标签
  

闽ICP备14008679号