诸暨麻将添加redis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

347 lines
9.0 KiB

  1. #include "Stdafx.h"
  2. #include "WHMD5CheckSum.h"
  3. /////////////////////////////////////////////////////////////////////////////////////////////////////
  4. //构造函数
  5. CWHMD5Checksum::CWHMD5Checksum()
  6. {
  7. //初始成员
  8. memset(m_lpszBuffer, 0, 64);
  9. m_nCount[0] = m_nCount[1] = 0;
  10. //初始变量
  11. m_lMD5[0] = MD5_INIT_STATE_0;
  12. m_lMD5[1] = MD5_INIT_STATE_1;
  13. m_lMD5[2] = MD5_INIT_STATE_2;
  14. m_lMD5[3] = MD5_INIT_STATE_3;
  15. }
  16. //析构函数
  17. CWHMD5Checksum::~CWHMD5Checksum()
  18. {
  19. }
  20. //获取校验和
  21. CString CWHMD5Checksum::GetMD5(const CString& strFilePath)
  22. {
  23. //打开文件
  24. CFile File;
  25. if (File.Open(strFilePath, CFile::modeRead | CFile::shareDenyNone) == false)
  26. {
  27. return TEXT("");
  28. }
  29. //返回校验和
  30. return GetMD5(File);
  31. }
  32. //获取校验和
  33. CString CWHMD5Checksum::GetMD5(CFile& File)
  34. {
  35. try
  36. {
  37. //变量定义
  38. CWHMD5Checksum MD5Checksum;
  39. int nLength = 0;
  40. const int nBufferSize = 1024;
  41. BYTE Buffer[nBufferSize];
  42. //校验文件
  43. while ((nLength = File.Read(Buffer, nBufferSize)) > 0)
  44. {
  45. MD5Checksum.Update(Buffer, nLength);
  46. }
  47. //完成校验
  48. return MD5Checksum.Final();
  49. }
  50. catch (CFileException* e)
  51. {
  52. TRACE0("CWHMD5Checksum::GetMD5: CFileException caught");
  53. throw e;
  54. }
  55. }
  56. //获取校验和
  57. CString CWHMD5Checksum::GetMD5(BYTE* pBuf, UINT nLength)
  58. {
  59. AfxIsValidAddress(pBuf, nLength, FALSE);
  60. //变量定义
  61. CWHMD5Checksum MD5Checksum;
  62. //计算校验和
  63. MD5Checksum.Update(pBuf, nLength);
  64. //完成校验
  65. return MD5Checksum.Final();
  66. }
  67. //
  68. CString CWHMD5Checksum::Final()
  69. {
  70. //变量定义
  71. BYTE Bits[8];
  72. DWordToByte(Bits, m_nCount, 8);
  73. //变量定义
  74. UINT nIndex = (UINT)((m_nCount[0] >> 3) & 0x3f);
  75. UINT nPadLen = (nIndex < 56) ? (56 - nIndex) : (120 - nIndex);
  76. Update(PADDING, nPadLen);
  77. //更新数据
  78. Update(Bits, 8);
  79. //变量定义
  80. const int nMD5Size = 16;
  81. unsigned char lpszMD5[nMD5Size];
  82. DWordToByte(lpszMD5, m_lMD5, nMD5Size);
  83. //转换类型
  84. CString strMD5;
  85. for (int i = 0; i < nMD5Size; i++)
  86. {
  87. CString Str;
  88. if (lpszMD5[i] == 0)
  89. {
  90. Str = CString("00");
  91. }
  92. else if (lpszMD5[i] <= 15)
  93. {
  94. Str.Format(TEXT("0%x"), lpszMD5[i]);
  95. }
  96. else
  97. {
  98. Str.Format(TEXT("%x"), lpszMD5[i]);
  99. }
  100. ASSERT(Str.GetLength() == 2);
  101. strMD5 += Str;
  102. }
  103. //结果校验
  104. ASSERT(strMD5.GetLength() == 32);
  105. return strMD5;
  106. }
  107. //转换数据
  108. VOID CWHMD5Checksum::Transform(BYTE Block[64])
  109. {
  110. //变量定义
  111. ULONG a = m_lMD5[0];
  112. ULONG b = m_lMD5[1];
  113. ULONG c = m_lMD5[2];
  114. ULONG d = m_lMD5[3];
  115. //变量定义
  116. ULONG X[16];
  117. //数据转换
  118. ByteToDWord(X, Block, 64);
  119. //1轮转换
  120. FF(a, b, c, d, X[0], MD5_S11, MD5_T01);
  121. FF(d, a, b, c, X[1], MD5_S12, MD5_T02);
  122. FF(c, d, a, b, X[2], MD5_S13, MD5_T03);
  123. FF(b, c, d, a, X[3], MD5_S14, MD5_T04);
  124. FF(a, b, c, d, X[4], MD5_S11, MD5_T05);
  125. FF(d, a, b, c, X[5], MD5_S12, MD5_T06);
  126. FF(c, d, a, b, X[6], MD5_S13, MD5_T07);
  127. FF(b, c, d, a, X[7], MD5_S14, MD5_T08);
  128. FF(a, b, c, d, X[8], MD5_S11, MD5_T09);
  129. FF(d, a, b, c, X[9], MD5_S12, MD5_T10);
  130. FF(c, d, a, b, X[10], MD5_S13, MD5_T11);
  131. FF(b, c, d, a, X[11], MD5_S14, MD5_T12);
  132. FF(a, b, c, d, X[12], MD5_S11, MD5_T13);
  133. FF(d, a, b, c, X[13], MD5_S12, MD5_T14);
  134. FF(c, d, a, b, X[14], MD5_S13, MD5_T15);
  135. FF(b, c, d, a, X[15], MD5_S14, MD5_T16);
  136. //2轮转换
  137. GG(a, b, c, d, X[1], MD5_S21, MD5_T17);
  138. GG(d, a, b, c, X[6], MD5_S22, MD5_T18);
  139. GG(c, d, a, b, X[11], MD5_S23, MD5_T19);
  140. GG(b, c, d, a, X[0], MD5_S24, MD5_T20);
  141. GG(a, b, c, d, X[5], MD5_S21, MD5_T21);
  142. GG(d, a, b, c, X[10], MD5_S22, MD5_T22);
  143. GG(c, d, a, b, X[15], MD5_S23, MD5_T23);
  144. GG(b, c, d, a, X[4], MD5_S24, MD5_T24);
  145. GG(a, b, c, d, X[9], MD5_S21, MD5_T25);
  146. GG(d, a, b, c, X[14], MD5_S22, MD5_T26);
  147. GG(c, d, a, b, X[3], MD5_S23, MD5_T27);
  148. GG(b, c, d, a, X[8], MD5_S24, MD5_T28);
  149. GG(a, b, c, d, X[13], MD5_S21, MD5_T29);
  150. GG(d, a, b, c, X[2], MD5_S22, MD5_T30);
  151. GG(c, d, a, b, X[7], MD5_S23, MD5_T31);
  152. GG(b, c, d, a, X[12], MD5_S24, MD5_T32);
  153. //3轮转换
  154. HH(a, b, c, d, X[5], MD5_S31, MD5_T33);
  155. HH(d, a, b, c, X[8], MD5_S32, MD5_T34);
  156. HH(c, d, a, b, X[11], MD5_S33, MD5_T35);
  157. HH(b, c, d, a, X[14], MD5_S34, MD5_T36);
  158. HH(a, b, c, d, X[1], MD5_S31, MD5_T37);
  159. HH(d, a, b, c, X[4], MD5_S32, MD5_T38);
  160. HH(c, d, a, b, X[7], MD5_S33, MD5_T39);
  161. HH(b, c, d, a, X[10], MD5_S34, MD5_T40);
  162. HH(a, b, c, d, X[13], MD5_S31, MD5_T41);
  163. HH(d, a, b, c, X[0], MD5_S32, MD5_T42);
  164. HH(c, d, a, b, X[3], MD5_S33, MD5_T43);
  165. HH(b, c, d, a, X[6], MD5_S34, MD5_T44);
  166. HH(a, b, c, d, X[9], MD5_S31, MD5_T45);
  167. HH(d, a, b, c, X[12], MD5_S32, MD5_T46);
  168. HH(c, d, a, b, X[15], MD5_S33, MD5_T47);
  169. HH(b, c, d, a, X[2], MD5_S34, MD5_T48);
  170. //4轮转换
  171. II(a, b, c, d, X[0], MD5_S41, MD5_T49);
  172. II(d, a, b, c, X[7], MD5_S42, MD5_T50);
  173. II(c, d, a, b, X[14], MD5_S43, MD5_T51);
  174. II(b, c, d, a, X[5], MD5_S44, MD5_T52);
  175. II(a, b, c, d, X[12], MD5_S41, MD5_T53);
  176. II(d, a, b, c, X[3], MD5_S42, MD5_T54);
  177. II(c, d, a, b, X[10], MD5_S43, MD5_T55);
  178. II(b, c, d, a, X[1], MD5_S44, MD5_T56);
  179. II(a, b, c, d, X[8], MD5_S41, MD5_T57);
  180. II(d, a, b, c, X[15], MD5_S42, MD5_T58);
  181. II(c, d, a, b, X[6], MD5_S43, MD5_T59);
  182. II(b, c, d, a, X[13], MD5_S44, MD5_T60);
  183. II(a, b, c, d, X[4], MD5_S41, MD5_T61);
  184. II(d, a, b, c, X[11], MD5_S42, MD5_T62);
  185. II(c, d, a, b, X[2], MD5_S43, MD5_T63);
  186. II(b, c, d, a, X[9], MD5_S44, MD5_T64);
  187. //设置校验和
  188. m_lMD5[0] += a;
  189. m_lMD5[1] += b;
  190. m_lMD5[2] += c;
  191. m_lMD5[3] += d;
  192. }
  193. //更新数据
  194. VOID CWHMD5Checksum::Update(BYTE* Input, ULONG nInputLen)
  195. {
  196. //变量定义
  197. UINT nIndex = (UINT)((m_nCount[0] >> 3) & 0x3F);
  198. //更新位数
  199. if ((m_nCount[0] += nInputLen << 3) < (nInputLen << 3))
  200. {
  201. m_nCount[1]++;
  202. }
  203. //设置变量
  204. m_nCount[1] += (nInputLen >> 29);
  205. //重复转换
  206. UINT i = 0;
  207. UINT nPartLen = 64 - nIndex;
  208. if (nInputLen >= nPartLen)
  209. {
  210. memcpy(&m_lpszBuffer[nIndex], Input, nPartLen);
  211. Transform(m_lpszBuffer);
  212. for (i = nPartLen; i + 63 < nInputLen; i += 64)
  213. {
  214. Transform(&Input[i]);
  215. }
  216. nIndex = 0;
  217. }
  218. else
  219. {
  220. i = 0;
  221. }
  222. //拷贝缓冲
  223. memcpy(&m_lpszBuffer[nIndex], &Input[i], nInputLen - i);
  224. }
  225. //类型转换
  226. VOID CWHMD5Checksum::ByteToDWord(DWORD* Output, BYTE* Input, UINT nLength)
  227. {
  228. //参数校验
  229. ASSERT(nLength % 4 == 0);
  230. ASSERT(AfxIsValidAddress(Output, nLength / 4, TRUE));
  231. ASSERT(AfxIsValidAddress(Input, nLength, FALSE));
  232. //变量定义
  233. UINT nOutIndex = 0;
  234. UINT nLoopIndex = 0;
  235. //转换拷贝
  236. for (; nLoopIndex < nLength; nOutIndex++, nLoopIndex += 4)
  237. {
  238. Output[nOutIndex] = (ULONG)Input[nLoopIndex] |
  239. (ULONG)Input[nLoopIndex + 1] << 8 |
  240. (ULONG)Input[nLoopIndex + 2] << 16 |
  241. (ULONG)Input[nLoopIndex + 3] << 24;
  242. }
  243. return;
  244. }
  245. //类型转换
  246. VOID CWHMD5Checksum::DWordToByte(BYTE* Output, DWORD* Input, UINT nLength)
  247. {
  248. //校验变量
  249. ASSERT(nLength % 4 == 0);
  250. ASSERT(AfxIsValidAddress(Output, nLength, TRUE));
  251. ASSERT(AfxIsValidAddress(Input, nLength / 4, FALSE));
  252. //转换拷贝
  253. UINT nInIndex = 0;
  254. UINT nLoopIndex = 0;
  255. for (; nLoopIndex < nLength; nInIndex++, nLoopIndex += 4)
  256. {
  257. Output[nLoopIndex] = (UCHAR)(Input[nInIndex] & 0xff);
  258. Output[nLoopIndex + 1] = (UCHAR)((Input[nInIndex] >> 8) & 0xff);
  259. Output[nLoopIndex + 2] = (UCHAR)((Input[nInIndex] >> 16) & 0xff);
  260. Output[nLoopIndex + 3] = (UCHAR)((Input[nInIndex] >> 24) & 0xff);
  261. }
  262. return;
  263. }
  264. //
  265. DWORD CWHMD5Checksum::RotateLeft(DWORD x, int n)
  266. {
  267. //参数校验
  268. ASSERT(sizeof(x) == 4);
  269. //返回结果
  270. return (x << n) | (x >> (32 - n));
  271. }
  272. VOID CWHMD5Checksum::FF(DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T)
  273. {
  274. DWORD F = (B & C) | (~B & D);
  275. A += F + X + T;
  276. A = RotateLeft(A, S);
  277. A += B;
  278. }
  279. VOID CWHMD5Checksum::GG(DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T)
  280. {
  281. DWORD G = (B & D) | (C & ~D);
  282. A += G + X + T;
  283. A = RotateLeft(A, S);
  284. A += B;
  285. }
  286. VOID CWHMD5Checksum::HH(DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T)
  287. {
  288. DWORD H = (B ^ C ^ D);
  289. A += H + X + T;
  290. A = RotateLeft(A, S);
  291. A += B;
  292. }
  293. VOID CWHMD5Checksum::II(DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T)
  294. {
  295. DWORD I = (C ^ (B | ~D));
  296. A += I + X + T;
  297. A = RotateLeft(A, S);
  298. A += B;
  299. }
  300. /////////////////////////////////////////////////////////////////////////////////////////////////////