wp7上MD5加密类

2024-03-30 17:02:59
很好的工具类 ,本身wp7 sdk没有自带加密类
  1. using System;
  2. using System.Net;
  3. using System.Text;
  4. using System.Windows;
  5. using System.Windows.Controls;
  6. using System.Windows.Documents;
  7. using System.Windows.Ink;
  8. using System.Windows.Input;
  9. using System.Windows.Media;
  10. using System.Windows.Media.Animation;
  11. using System.Windows.Shapes;
  12. namespace Test.Utils
  13. {
  14. struct ABCDStruct
  15. {
  16. public uint A;
  17. public uint B;
  18. public uint C;
  19. public uint D;
  20. }
  21. /// <summary>
  22. /// md5加密类
  23. /// </summary>
  24. public sealed class MD5Core
  25. {
  26. //Prevent CSC from adding a default public constructor
  27. public MD5Core() { }
  28. public static byte[] GetHash(string input, Encoding encoding)
  29. {
  30. if (null == input)
  31. throw new System.ArgumentNullException("input", "Unable to calculate hash over null input data");
  32. if (null == encoding)
  33. throw new System.ArgumentNullException("encoding", "Unable to calculate hash over a string without a default encoding. Consider using the GetHash(string) overload to use UTF8 Encoding");
  34. byte[] target = encoding.GetBytes(input);
  35. return GetHash(target);
  36. }
  37. public static byte[] GetHash(string input)
  38. {
  39. return GetHash(input, new UTF8Encoding());
  40. }
  41. public static string GetHashString(byte[] input)
  42. {
  43. if (null == input)
  44. throw new System.ArgumentNullException("input", "Unable to calculate hash over null input data");
  45. string retval = BitConverter.ToString(GetHash(input));
  46. retvalretval = retval.Replace("-", "");
  47. return retval;
  48. }
  49. public static string GetHashString(string input, Encoding encoding)
  50. {
  51. if (null == input)
  52. throw new System.ArgumentNullException("input", "Unable to calculate hash over null input data");
  53. if (null == encoding)
  54. throw new System.ArgumentNullException("encoding", "Unable to calculate hash over a string without a default encoding. Consider using the GetHashString(string) overload to use UTF8 Encoding");
  55. byte[] target = encoding.GetBytes(input);
  56. return GetHashString(target);
  57. }
  58. public static string GetHashString(string input)
  59. {
  60. return GetHashString(input, new UTF8Encoding());
  61. }
  62. public static byte[] GetHash(byte[] input)
  63. {
  64. if (null == input)
  65. throw new System.ArgumentNullException("input", "Unable to calculate hash over null input data");
  66. //Intitial values defined in RFC 1321
  67. ABCDStruct abcd = new ABCDStruct();
  68. abcd.A = 0x67452301;
  69. abcd.B = 0xefcdab89;
  70. abcd.C = 0x98badcfe;
  71. abcd.D = 0x10325476;
  72. //We pass in the input array by block, the final block of data must be handled specialy for padding & length embeding
  73. int startIndex = 0;
  74. while (startIndex <= input.Length - 64)
  75. {
  76. MD5Core.GetHashBlock(input, ref abcd, startIndex);
  77. startIndex += 64;
  78. }
  79. // The final data block.
  80. return MD5Core.GetHashFinalBlock(input, startIndex, input.Length - startIndex, abcd, (Int64)input.Length * 8);
  81. }
  82. internal static byte[] GetHashFinalBlock(byte[] input, int ibStart, int cbSize, ABCDStruct ABCD, Int64 len)
  83. {
  84. byte[] working = new byte[64];
  85. byte[] length = BitConverter.GetBytes(len);
  86. //Padding is a single bit 1, followed by the number of 0s required to make size congruent to 448 modulo 512. Step 1 of RFC 1321
  87. //The CLR ensures that our buffer is 0-assigned, we don't need to explicitly set it. This is why it ends up being quicker to just
  88. //use a temporary array rather then doing in-place assignment (5% for small inputs)
  89. Array.Copy(input, ibStart, working, 0, cbSize);
  90. working[cbSize] = 0x80;
  91. //We have enough room to store the length in this chunk
  92. if (cbSize <= 56)
  93. {
  94. Array.Copy(length, 0, working, 56, 8);
  95. GetHashBlock(working, ref ABCD, 0);
  96. }
  97. else  //We need an aditional chunk to store the length
  98. {
  99. GetHashBlock(working, ref ABCD, 0);
  100. //Create an entirely new chunk due to the 0-assigned trick mentioned above, to avoid an extra function call clearing the array
  101. working = new byte[64];
  102. Array.Copy(length, 0, working, 56, 8);
  103. GetHashBlock(working, ref ABCD, 0);
  104. }
  105. byte[] output = new byte[16];
  106. Array.Copy(BitConverter.GetBytes(ABCD.A), 0, output, 0, 4);
  107. Array.Copy(BitConverter.GetBytes(ABCD.B), 0, output, 4, 4);
  108. Array.Copy(BitConverter.GetBytes(ABCD.C), 0, output, 8, 4);
  109. Array.Copy(BitConverter.GetBytes(ABCD.D), 0, output, 12, 4);
  110. return output;
  111. }
  112. // Performs a single block transform of MD5 for a given set of ABCD inputs
  113. /* If implementing your own hashing framework, be sure to set the initial ABCD correctly according to RFC 1321:
  114. //    A = 0x67452301;
  115. //    B = 0xefcdab89;
  116. //    C = 0x98badcfe;
  117. //    D = 0x10325476;
  118. */
  119. internal static void GetHashBlock(byte[] input, ref ABCDStruct ABCDValue, int ibStart)
  120. {
  121. uint[] temp = Converter(input, ibStart);
  122. uint a = ABCDValue.A;
  123. uint b = ABCDValue.B;
  124. uint c = ABCDValue.C;
  125. uint d = ABCDValue.D;
  126. a = r1(a, b, c, d, temp[0], 7, 0xd76aa478);
  127. d = r1(d, a, b, c, temp[1], 12, 0xe8c7b756);
  128. c = r1(c, d, a, b, temp[2], 17, 0x242070db);
  129. b = r1(b, c, d, a, temp[3], 22, 0xc1bdceee);
  130. a = r1(a, b, c, d, temp[4], 7, 0xf57c0faf);
  131. d = r1(d, a, b, c, temp[5], 12, 0x4787c62a);
  132. c = r1(c, d, a, b, temp[6], 17, 0xa8304613);
  133. b = r1(b, c, d, a, temp[7], 22, 0xfd469501);
  134. a = r1(a, b, c, d, temp[8], 7, 0x698098d8);
  135. d = r1(d, a, b, c, temp[9], 12, 0x8b44f7af);
  136. c = r1(c, d, a, b, temp[10], 17, 0xffff5bb1);
  137. b = r1(b, c, d, a, temp[11], 22, 0x895cd7be);
  138. a = r1(a, b, c, d, temp[12], 7, 0x6b901122);
  139. d = r1(d, a, b, c, temp[13], 12, 0xfd987193);
  140. c = r1(c, d, a, b, temp[14], 17, 0xa679438e);
  141. b = r1(b, c, d, a, temp[15], 22, 0x49b40821);
  142. a = r2(a, b, c, d, temp[1], 5, 0xf61e2562);
  143. d = r2(d, a, b, c, temp[6], 9, 0xc040b340);
  144. c = r2(c, d, a, b, temp[11], 14, 0x265e5a51);
  145. b = r2(b, c, d, a, temp[0], 20, 0xe9b6c7aa);
  146. a = r2(a, b, c, d, temp[5], 5, 0xd62f105d);
  147. d = r2(d, a, b, c, temp[10], 9, 0x02441453);
  148. c = r2(c, d, a, b, temp[15], 14, 0xd8a1e681);
  149. b = r2(b, c, d, a, temp[4], 20, 0xe7d3fbc8);
  150. a = r2(a, b, c, d, temp[9], 5, 0x21e1cde6);
  151. d = r2(d, a, b, c, temp[14], 9, 0xc33707d6);
  152. c = r2(c, d, a, b, temp[3], 14, 0xf4d50d87);
  153. b = r2(b, c, d, a, temp[8], 20, 0x455a14ed);
  154. a = r2(a, b, c, d, temp[13], 5, 0xa9e3e905);
  155. d = r2(d, a, b, c, temp[2], 9, 0xfcefa3f8);
  156. c = r2(c, d, a, b, temp[7], 14, 0x676f02d9);
  157. b = r2(b, c, d, a, temp[12], 20, 0x8d2a4c8a);
  158. a = r3(a, b, c, d, temp[5], 4, 0xfffa3942);
  159. d = r3(d, a, b, c, temp[8], 11, 0x8771f681);
  160. c = r3(c, d, a, b, temp[11], 16, 0x6d9d6122);
  161. b = r3(b, c, d, a, temp[14], 23, 0xfde5380c);
  162. a = r3(a, b, c, d, temp[1], 4, 0xa4beea44);
  163. d = r3(d, a, b, c, temp[4], 11, 0x4bdecfa9);
  164. c = r3(c, d, a, b, temp[7], 16, 0xf6bb4b60);
  165. b = r3(b, c, d, a, temp[10], 23, 0xbebfbc70);
  166. a = r3(a, b, c, d, temp[13], 4, 0x289b7ec6);
  167. d = r3(d, a, b, c, temp[0], 11, 0xeaa127fa);
  168. c = r3(c, d, a, b, temp[3], 16, 0xd4ef3085);
  169. b = r3(b, c, d, a, temp[6], 23, 0x04881d05);
  170. a = r3(a, b, c, d, temp[9], 4, 0xd9d4d039);
  171. d = r3(d, a, b, c, temp[12], 11, 0xe6db99e5);
  172. c = r3(c, d, a, b, temp[15], 16, 0x1fa27cf8);
  173. b = r3(b, c, d, a, temp[2], 23, 0xc4ac5665);
  174. a = r4(a, b, c, d, temp[0], 6, 0xf4292244);
  175. d = r4(d, a, b, c, temp[7], 10, 0x432aff97);
  176. c = r4(c, d, a, b, temp[14], 15, 0xab9423a7);
  177. b = r4(b, c, d, a, temp[5], 21, 0xfc93a039);
  178. a = r4(a, b, c, d, temp[12], 6, 0x655b59c3);
  179. d = r4(d, a, b, c, temp[3], 10, 0x8f0ccc92);
  180. c = r4(c, d, a, b, temp[10], 15, 0xffeff47d);
  181. b = r4(b, c, d, a, temp[1], 21, 0x85845dd1);
  182. a = r4(a, b, c, d, temp[8], 6, 0x6fa87e4f);
  183. d = r4(d, a, b, c, temp[15], 10, 0xfe2ce6e0);
  184. c = r4(c, d, a, b, temp[6], 15, 0xa3014314);
  185. b = r4(b, c, d, a, temp[13], 21, 0x4e0811a1);
  186. a = r4(a, b, c, d, temp[4], 6, 0xf7537e82);
  187. d = r4(d, a, b, c, temp[11], 10, 0xbd3af235);
  188. c = r4(c, d, a, b, temp[2], 15, 0x2ad7d2bb);
  189. b = r4(b, c, d, a, temp[9], 21, 0xeb86d391);
  190. ABCDValue.A = unchecked(a + ABCDValue.A);
  191. ABCDValue.B = unchecked(b + ABCDValue.B);
  192. ABCDValue.C = unchecked(c + ABCDValue.C);
  193. ABCDValue.D = unchecked(d + ABCDValue.D);
  194. return;
  195. }
  196. //Manually unrolling these equations nets us a 20% performance improvement
  197. private static uint r1(uint a, uint b, uint c, uint d, uint x, int s, uint t)
  198. {
  199. //                  (b + LSR((a + F(b, c, d) + x + t), s))
  200. //F(x, y, z)        ((x & y) | ((x ^ 0xFFFFFFFF) & z))
  201. return unchecked(b + LSR((a + ((b & c) | ((b ^ 0xFFFFFFFF) & d)) + x + t), s));
  202. }
  203. private static uint r2(uint a, uint b, uint c, uint d, uint x, int s, uint t)
  204. {
  205. //                  (b + LSR((a + G(b, c, d) + x + t), s))
  206. //G(x, y, z)        ((x & z) | (y & (z ^ 0xFFFFFFFF)))
  207. return unchecked(b + LSR((a + ((b & d) | (c & (d ^ 0xFFFFFFFF))) + x + t), s));
  208. }
  209. private static uint r3(uint a, uint b, uint c, uint d, uint x, int s, uint t)
  210. {
  211. //                  (b + LSR((a + H(b, c, d) + k + i), s))
  212. //H(x, y, z)        (x ^ y ^ z)
  213. return unchecked(b + LSR((a + (b ^ c ^ d) + x + t), s));
  214. }
  215. private static uint r4(uint a, uint b, uint c, uint d, uint x, int s, uint t)
  216. {
  217. //                  (b + LSR((a + I(b, c, d) + k + i), s))
  218. //I(x, y, z)        (y ^ (x | (z ^ 0xFFFFFFFF)))
  219. return unchecked(b + LSR((a + (c ^ (b | (d ^ 0xFFFFFFFF))) + x + t), s));
  220. }
  221. // Implementation of left rotate
  222. // s is an int instead of a uint becuase the CLR requires the argument passed to >>/<< is of
  223. // type int. Doing the demoting inside this function would add overhead.
  224. private static uint LSR(uint i, int s)
  225. {
  226. return ((i << s) | (i >> (32 - s)));
  227. }
  228. //Convert input array into array of UInts
  229. private static uint[] Converter(byte[] input, int ibStart)
  230. {
  231. if (null == input)
  232. throw new System.ArgumentNullException("input", "Unable convert null array to array of uInts");
  233. uint[] result = new uint[16];
  234. for (int i = 0; i < 16; i++)
  235. {
  236. result[i] = (uint)input[ibStart + i * 4];
  237. result[i] += (uint)input[ibStart + i * 4 + 1] << 8;
  238. result[i] += (uint)input[ibStart + i * 4 + 2] << 16;
  239. result[i] += (uint)input[ibStart + i * 4 + 3] << 24;
  240. }
  241. return result;
  242. }
  243. }
  244. }

转载于:https://blog.51cto.com/sxchao/846839

wp7上MD5加密类相关推荐

  1. java md5 32位加密算法_java 32位md5加密类

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. import java.security.MessageDigest; import ja ...

  2. java md5类_java的md5加密类

    MD5算法是将数据进行不可逆加密的算法有较好的安全性,在国内如寿信的安全支付平台就采用此算法. 源代码如下 /********************************************* ...

  3. c#编写的MD5加密类

    using System.Security.Cryptography; //   //MD5加密函数   //   public string MD5(String str)   {    MD5 m ...

  4. java md5 decode_Java MD5加密类

    1 /*************************************************2 md5 类实现了RSA Data Security, Inc.在提交给IETF3 的RFC1 ...

  5. MD5加密工具类(实战版)

    MD5加密工具类(实战版) 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成 ...

  6. java自带的md5加密_JDK自带MD5加密算法

    [     在各种应用系统的开发中,经常需要存储用户信息,很多地方都要存储用户密码,而将用户密码直接存储在服务器上显然是不安全的,本文简要介绍工作中常用的 MD5加密算 其实jdk就自带了md5加密算 ...

  7. MD5工具类 加盐加密 及编码

    titls: MD5工具类加密 date: 2018/11/12 10:03:42 categories: 开发module import java.security.MessageDigest; i ...

  8. md5加密数据表中的密码php,JSP_使用MD5加密数据库中的用户密码(一),我们知道,现在网络上一般的 - phpStudy...

    使用MD5加密数据库中的用户密码(一) 我们知道,现在网络上一般的网站,稍微完善一点的,往往都需要用户先注册,提供诸如电子邮件.账号.密码等信息以后,成为网站栏目的注册用户,才可以享受网站一些特殊栏目 ...

  9. 【java小程序实战】小程序短视频后台项目之MD5加密工具类

    对字符串进行简单加密,直接上代码: package com.imooc.utils;import org.apache.commons.codec.binary.Base64;import java. ...

最新文章

  1. 第十一届山东省大学生程序设计竞赛 L. Construction of 5G Base Stations(概率期望,递推前缀和优化)
  2. 7.Nginx_Keepalived高可用配置
  3. avcodec_receive_packet 11
  4. Linux里的稀疏文件
  5. solaris安装java_Solaris是出色的Java开发平台的原因
  6. 关于在asp.net中播放MP4格式的视频(好吧,只兼容支持html5的浏览器,ie8及以下的都歇菜了)...
  7. 论文浅尝 | 动态词嵌入
  8. cookie和session基础以及在Django中应用
  9. 电脑版idm下载器好不好用?
  10. 计算机无法打开浏览器,win7电脑打开ie浏览器被提示“该页无法显示”怎么解决...
  11. 如何快速的入门单片机?单片机自学教程有哪些?
  12. 问题:IndentationError: unindent does not match any outer indentation level
  13. 软件开发成本构成及评估
  14. Java实现的中间库
  15. sublime指定python版本
  16. 【引路帖】【MATLAB】【求解最优化问题】
  17. 什么是OXC(全光交叉)?
  18. 2014年互联网IT公司产品、技术类人员工资待遇汇总 2015部分补充
  19. 系统移植丨使用傲梅分区助手和EasyBCD迁移系统盘
  20. Linux中如何优雅的批量合并、拆分、加密pdf文件

热门文章

  1. 数据驱动的云托管服务最佳范式
  2. python3精简笔记——开篇
  3. 查看SqlServer的内存使用情况
  4. C# 中获取CPU序列号/网卡mac地址
  5. java --级联操作(查询/更新)
  6. ADO.NET 快速入门(四):从数据库填充 DataSet
  7. 总结C#保留小数位数
  8. WiFi相关基础概念
  9. Can't create table './store/#sql-b2c_1a.frm' (errno: 150)解决方法
  10. C++ 智能指针详解