诸暨麻将添加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.
 
 
 
 
 
 

549 lines
18 KiB

  1. #include "StdAfx.h"
  2. #include "WHEncrypt.h"
  3. //////////////////////////////////////////////////////////////////////////////////
  4. //常量定义
  5. //加密常量
  6. #define S11 7 //数据常量
  7. #define S12 12 //数据常量
  8. #define S13 17 //数据常量
  9. #define S14 22 //数据常量
  10. #define S21 5 //数据常量
  11. #define S22 9 //数据常量
  12. #define S23 14 //数据常量
  13. #define S24 20 //数据常量
  14. #define S31 4 //数据常量
  15. #define S32 11 //数据常量
  16. #define S33 16 //数据常量
  17. #define S34 23 //数据常量
  18. #define S41 6 //数据常量
  19. #define S42 10 //数据常量
  20. #define S43 15 //数据常量
  21. #define S44 21 //数据常量
  22. //密钥长度
  23. #define ENCRYPT_KEY_LEN 8 //密钥长度
  24. //////////////////////////////////////////////////////////////////////////////////
  25. //函数定义
  26. #define H(x,y,z) ((x)^(y)^(z))
  27. #define I(x,y,z) ((y)^((x)|(~z)))
  28. #define F(x,y,z) (((x)&(y))|((~x)&(z)))
  29. #define G(x,y,z) (((x)&(z))|((y)&(~z)))
  30. #define ROTATE_LEFT(x,n) (((x)<<(n))|((x)>>(32-(n))))
  31. //函数定义
  32. #define FF(a,b,c,d,x,s,ac) \
  33. { \
  34. (a) += F((b), (c), (d)) + (x)+(ULONG)(ac); \
  35. (a) = ROTATE_LEFT((a), (s)); \
  36. (a) += (b); \
  37. }
  38. //函数定义
  39. #define GG(a,b,c,d,x,s,ac) \
  40. { \
  41. (a) += G((b), (c), (d)) + (x)+(ULONG)(ac); \
  42. (a) = ROTATE_LEFT((a), (s)); \
  43. (a) += (b); \
  44. }
  45. //函数定义
  46. #define HH(a,b,c,d,x,s,ac) \
  47. { \
  48. (a) += H((b), (c), (d)) + (x)+(ULONG)(ac); \
  49. (a) = ROTATE_LEFT((a), (s)); \
  50. (a) += (b); \
  51. }
  52. //函数定义
  53. #define II(a,b,c,d,x,s,ac) \
  54. { \
  55. (a) += I((b), (c), (d)) + (x)+(ULONG)(ac); \
  56. (a) = ROTATE_LEFT((a), (s)); \
  57. (a) += (b); \
  58. }
  59. //////////////////////////////////////////////////////////////////////////////////
  60. //加密映射
  61. const BYTE g_cbEncryptMap[256] =
  62. {
  63. 0x70, 0x2F, 0x40, 0x5F, 0x44, 0x8E, 0x6E, 0x45, 0x7E, 0xAB, 0x2C, 0x1F, 0xB4, 0xAC, 0x9D, 0x91,
  64. 0x0D, 0x36, 0x9B, 0x0B, 0xD4, 0xC4, 0x39, 0x74, 0xBF, 0x23, 0x16, 0x14, 0x06, 0xEB, 0x04, 0x3E,
  65. 0x12, 0x5C, 0x8B, 0xBC, 0x61, 0x63, 0xF6, 0xA5, 0xE1, 0x65, 0xD8, 0xF5, 0x5A, 0x07, 0xF0, 0x13,
  66. 0xF2, 0x20, 0x6B, 0x4A, 0x24, 0x59, 0x89, 0x64, 0xD7, 0x42, 0x6A, 0x5E, 0x3D, 0x0A, 0x77, 0xE0,
  67. 0x80, 0x27, 0xB8, 0xC5, 0x8C, 0x0E, 0xFA, 0x8A, 0xD5, 0x29, 0x56, 0x57, 0x6C, 0x53, 0x67, 0x41,
  68. 0xE8, 0x00, 0x1A, 0xCE, 0x86, 0x83, 0xB0, 0x22, 0x28, 0x4D, 0x3F, 0x26, 0x46, 0x4F, 0x6F, 0x2B,
  69. 0x72, 0x3A, 0xF1, 0x8D, 0x97, 0x95, 0x49, 0x84, 0xE5, 0xE3, 0x79, 0x8F, 0x51, 0x10, 0xA8, 0x82,
  70. 0xC6, 0xDD, 0xFF, 0xFC, 0xE4, 0xCF, 0xB3, 0x09, 0x5D, 0xEA, 0x9C, 0x34, 0xF9, 0x17, 0x9F, 0xDA,
  71. 0x87, 0xF8, 0x15, 0x05, 0x3C, 0xD3, 0xA4, 0x85, 0x2E, 0xFB, 0xEE, 0x47, 0x3B, 0xEF, 0x37, 0x7F,
  72. 0x93, 0xAF, 0x69, 0x0C, 0x71, 0x31, 0xDE, 0x21, 0x75, 0xA0, 0xAA, 0xBA, 0x7C, 0x38, 0x02, 0xB7,
  73. 0x81, 0x01, 0xFD, 0xE7, 0x1D, 0xCC, 0xCD, 0xBD, 0x1B, 0x7A, 0x2A, 0xAD, 0x66, 0xBE, 0x55, 0x33,
  74. 0x03, 0xDB, 0x88, 0xB2, 0x1E, 0x4E, 0xB9, 0xE6, 0xC2, 0xF7, 0xCB, 0x7D, 0xC9, 0x62, 0xC3, 0xA6,
  75. 0xDC, 0xA7, 0x50, 0xB5, 0x4B, 0x94, 0xC0, 0x92, 0x4C, 0x11, 0x5B, 0x78, 0xD9, 0xB1, 0xED, 0x19,
  76. 0xE9, 0xA1, 0x1C, 0xB6, 0x32, 0x99, 0xA3, 0x76, 0x9E, 0x7B, 0x6D, 0x9A, 0x30, 0xD6, 0xA9, 0x25,
  77. 0xC7, 0xAE, 0x96, 0x35, 0xD0, 0xBB, 0xD2, 0xC8, 0xA2, 0x08, 0xF3, 0xD1, 0x73, 0xF4, 0x48, 0x2D,
  78. 0x90, 0xCA, 0xE2, 0x58, 0xC1, 0x18, 0x52, 0xFE, 0xDF, 0x68, 0x98, 0x54, 0xEC, 0x60, 0x43, 0x0F
  79. };
  80. //解密映射
  81. const BYTE g_cbCrevasseMap[256] =
  82. {
  83. 0x51, 0xA1, 0x9E, 0xB0, 0x1E, 0x83, 0x1C, 0x2D, 0xE9, 0x77, 0x3D, 0x13, 0x93, 0x10, 0x45, 0xFF,
  84. 0x6D, 0xC9, 0x20, 0x2F, 0x1B, 0x82, 0x1A, 0x7D, 0xF5, 0xCF, 0x52, 0xA8, 0xD2, 0xA4, 0xB4, 0x0B,
  85. 0x31, 0x97, 0x57, 0x19, 0x34, 0xDF, 0x5B, 0x41, 0x58, 0x49, 0xAA, 0x5F, 0x0A, 0xEF, 0x88, 0x01,
  86. 0xDC, 0x95, 0xD4, 0xAF, 0x7B, 0xE3, 0x11, 0x8E, 0x9D, 0x16, 0x61, 0x8C, 0x84, 0x3C, 0x1F, 0x5A,
  87. 0x02, 0x4F, 0x39, 0xFE, 0x04, 0x07, 0x5C, 0x8B, 0xEE, 0x66, 0x33, 0xC4, 0xC8, 0x59, 0xB5, 0x5D,
  88. 0xC2, 0x6C, 0xF6, 0x4D, 0xFB, 0xAE, 0x4A, 0x4B, 0xF3, 0x35, 0x2C, 0xCA, 0x21, 0x78, 0x3B, 0x03,
  89. 0xFD, 0x24, 0xBD, 0x25, 0x37, 0x29, 0xAC, 0x4E, 0xF9, 0x92, 0x3A, 0x32, 0x4C, 0xDA, 0x06, 0x5E,
  90. 0x00, 0x94, 0x60, 0xEC, 0x17, 0x98, 0xD7, 0x3E, 0xCB, 0x6A, 0xA9, 0xD9, 0x9C, 0xBB, 0x08, 0x8F,
  91. 0x40, 0xA0, 0x6F, 0x55, 0x67, 0x87, 0x54, 0x80, 0xB2, 0x36, 0x47, 0x22, 0x44, 0x63, 0x05, 0x6B,
  92. 0xF0, 0x0F, 0xC7, 0x90, 0xC5, 0x65, 0xE2, 0x64, 0xFA, 0xD5, 0xDB, 0x12, 0x7A, 0x0E, 0xD8, 0x7E,
  93. 0x99, 0xD1, 0xE8, 0xD6, 0x86, 0x27, 0xBF, 0xC1, 0x6E, 0xDE, 0x9A, 0x09, 0x0D, 0xAB, 0xE1, 0x91,
  94. 0x56, 0xCD, 0xB3, 0x76, 0x0C, 0xC3, 0xD3, 0x9F, 0x42, 0xB6, 0x9B, 0xE5, 0x23, 0xA7, 0xAD, 0x18,
  95. 0xC6, 0xF4, 0xB8, 0xBE, 0x15, 0x43, 0x70, 0xE0, 0xE7, 0xBC, 0xF1, 0xBA, 0xA5, 0xA6, 0x53, 0x75,
  96. 0xE4, 0xEB, 0xE6, 0x85, 0x14, 0x48, 0xDD, 0x38, 0x2A, 0xCC, 0x7F, 0xB1, 0xC0, 0x71, 0x96, 0xF8,
  97. 0x3F, 0x28, 0xF2, 0x69, 0x74, 0x68, 0xB7, 0xA3, 0x50, 0xD0, 0x79, 0x1D, 0xFC, 0xCE, 0x8A, 0x8D,
  98. 0x2E, 0x62, 0x30, 0xEA, 0xED, 0x2B, 0x26, 0xB9, 0x81, 0x7C, 0x46, 0x89, 0x73, 0xA2, 0xF7, 0x72
  99. };
  100. //////////////////////////////////////////////////////////////////////////////////
  101. //MD5 加密
  102. class CMD5Aide
  103. {
  104. //变量定义
  105. private:
  106. ULONG m_lCount[2]; //加密变量
  107. ULONG m_lState[4]; //加密变量
  108. UCHAR m_cbBuffer[64]; //加密变量
  109. UCHAR m_cbPadding[64]; //加密变量
  110. //函数定义
  111. public:
  112. //构造函数
  113. CMD5Aide() { MD5Init(); }
  114. //功能函数
  115. public:
  116. //最终结果
  117. VOID MD5Final(BYTE digest[16]);
  118. //设置数值
  119. VOID MD5Update(BYTE * pcbInput, UINT inputLen);
  120. //内部函数
  121. private:
  122. //初始化
  123. VOID MD5Init();
  124. //置位函数
  125. VOID MD5Memset(BYTE * pcbOutput, INT nValue, UINT nLen);
  126. //拷贝函数
  127. VOID MD5Memcpy(BYTE * pcbOutput, BYTE * pcbInput, UINT nLen);
  128. //转换函数
  129. VOID MD5Transform(ULONG lState[4], BYTE cbBlock[64]);
  130. //编码函数
  131. private:
  132. //编码函数
  133. VOID Encode(BYTE * pcbOutput, ULONG * pcbInput, UINT nLen);
  134. //解码函数
  135. VOID Decode(ULONG * pcbOutput, BYTE * pcbInput, UINT nLen);
  136. };
  137. //////////////////////////////////////////////////////////////////////////////////
  138. //初始化
  139. VOID CMD5Aide::MD5Init()
  140. {
  141. m_lCount[0] = 0;
  142. m_lCount[1] = 0;
  143. m_lState[0] = 0x67452301;
  144. m_lState[1] = 0xefcdab89;
  145. m_lState[2] = 0x98badcfe;
  146. m_lState[3] = 0x10325476;
  147. MD5Memset(m_cbPadding, 0, sizeof(m_cbPadding));
  148. *m_cbPadding = 0x80;
  149. return;
  150. }
  151. //更新函数
  152. VOID CMD5Aide::MD5Update(BYTE * pcbInput, UINT inputLen)
  153. {
  154. UINT i, nIndex, nPartLen;
  155. nIndex = (UINT)((this->m_lCount[0] >> 3) & 0x3F);
  156. if ((m_lCount[0] += ((ULONG)inputLen << 3)) < ((ULONG)inputLen << 3)) m_lCount[1]++;
  157. m_lCount[1] += ((ULONG)inputLen >> 29);
  158. nPartLen = 64 - nIndex;
  159. if (inputLen >= nPartLen)
  160. {
  161. MD5Memcpy((BYTE*)&m_cbBuffer[nIndex], (BYTE *)pcbInput, nPartLen);
  162. MD5Transform(m_lState, m_cbBuffer);
  163. for (i = nPartLen; i + 63 < inputLen; i += 64) MD5Transform(m_lState, &pcbInput[i]);
  164. nIndex = 0;
  165. }
  166. else i = 0;
  167. MD5Memcpy((BYTE*)&m_cbBuffer[nIndex], (BYTE *)&pcbInput[i], inputLen - i);
  168. return;
  169. }
  170. //最终结果
  171. VOID CMD5Aide::MD5Final(BYTE digest[16])
  172. {
  173. BYTE cbBits[8];
  174. UINT nIndex, nPartLen;
  175. Encode(cbBits, m_lCount, 8);
  176. nIndex = (UINT)((m_lCount[0] >> 3) & 0x3f);
  177. nPartLen = (nIndex < 56) ? (56 - nIndex) : (120 - nIndex);
  178. MD5Update(m_cbPadding, nPartLen);
  179. MD5Update(cbBits, 8);
  180. Encode(digest, m_lState, 16);
  181. MD5Memset((BYTE*)this, 0, sizeof (*this));
  182. MD5Init();
  183. return;
  184. }
  185. //转换函数
  186. VOID CMD5Aide::MD5Transform(ULONG lState[4], BYTE cbBlock[64])
  187. {
  188. ULONG a = lState[0], b = lState[1], c = lState[2], d = lState[3], x[16];
  189. Decode(x, cbBlock, 64);
  190. FF(a, b, c, d, x[0], S11, 0xd76aa478); /* 1 */
  191. FF(d, a, b, c, x[1], S12, 0xe8c7b756); /* 2 */
  192. FF(c, d, a, b, x[2], S13, 0x242070db); /* 3 */
  193. FF(b, c, d, a, x[3], S14, 0xc1bdceee); /* 4 */
  194. FF(a, b, c, d, x[4], S11, 0xf57c0faf); /* 5 */
  195. FF(d, a, b, c, x[5], S12, 0x4787c62a); /* 6 */
  196. FF(c, d, a, b, x[6], S13, 0xa8304613); /* 7 */
  197. FF(b, c, d, a, x[7], S14, 0xfd469501); /* 8 */
  198. FF(a, b, c, d, x[8], S11, 0x698098d8); /* 9 */
  199. FF(d, a, b, c, x[9], S12, 0x8b44f7af); /* 10 */
  200. FF(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
  201. FF(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
  202. FF(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
  203. FF(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
  204. FF(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
  205. FF(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
  206. GG(a, b, c, d, x[1], S21, 0xf61e2562); /* 17 */
  207. GG(d, a, b, c, x[6], S22, 0xc040b340); /* 18 */
  208. GG(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
  209. GG(b, c, d, a, x[0], S24, 0xe9b6c7aa); /* 20 */
  210. GG(a, b, c, d, x[5], S21, 0xd62f105d); /* 21 */
  211. GG(d, a, b, c, x[10], S22, 0x2441453); /* 22 */
  212. GG(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
  213. GG(b, c, d, a, x[4], S24, 0xe7d3fbc8); /* 24 */
  214. GG(a, b, c, d, x[9], S21, 0x21e1cde6); /* 25 */
  215. GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
  216. GG(c, d, a, b, x[3], S23, 0xf4d50d87); /* 27 */
  217. GG(b, c, d, a, x[8], S24, 0x455a14ed); /* 28 */
  218. GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
  219. GG(d, a, b, c, x[2], S22, 0xfcefa3f8); /* 30 */
  220. GG(c, d, a, b, x[7], S23, 0x676f02d9); /* 31 */
  221. GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
  222. HH(a, b, c, d, x[5], S31, 0xfffa3942); /* 33 */
  223. HH(d, a, b, c, x[8], S32, 0x8771f681); /* 34 */
  224. HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
  225. HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
  226. HH(a, b, c, d, x[1], S31, 0xa4beea44); /* 37 */
  227. HH(d, a, b, c, x[4], S32, 0x4bdecfa9); /* 38 */
  228. HH(c, d, a, b, x[7], S33, 0xf6bb4b60); /* 39 */
  229. HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
  230. HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
  231. HH(d, a, b, c, x[0], S32, 0xeaa127fa); /* 42 */
  232. HH(c, d, a, b, x[3], S33, 0xd4ef3085); /* 43 */
  233. HH(b, c, d, a, x[6], S34, 0x4881d05); /* 44 */
  234. HH(a, b, c, d, x[9], S31, 0xd9d4d039); /* 45 */
  235. HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
  236. HH(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
  237. HH(b, c, d, a, x[2], S34, 0xc4ac5665); /* 48 */
  238. II(a, b, c, d, x[0], S41, 0xf4292244); /* 49 */
  239. II(d, a, b, c, x[7], S42, 0x432aff97); /* 50 */
  240. II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
  241. II(b, c, d, a, x[5], S44, 0xfc93a039); /* 52 */
  242. II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
  243. II(d, a, b, c, x[3], S42, 0x8f0ccc92); /* 54 */
  244. II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
  245. II(b, c, d, a, x[1], S44, 0x85845dd1); /* 56 */
  246. II(a, b, c, d, x[8], S41, 0x6fa87e4f); /* 57 */
  247. II(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
  248. II(c, d, a, b, x[6], S43, 0xa3014314); /* 59 */
  249. II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
  250. II(a, b, c, d, x[4], S41, 0xf7537e82); /* 61 */
  251. II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
  252. II(c, d, a, b, x[2], S43, 0x2ad7d2bb); /* 63 */
  253. II(b, c, d, a, x[9], S44, 0xeb86d391); /* 64 */
  254. lState[0] += a;
  255. lState[1] += b;
  256. lState[2] += c;
  257. lState[3] += d;
  258. MD5Memset((BYTE *)x, 0, sizeof(x));
  259. return;
  260. }
  261. //编码函数
  262. VOID CMD5Aide::Encode(BYTE * pcbOutput, ULONG * pcbInput, UINT nLen)
  263. {
  264. UINT i, j;
  265. for (i = 0, j = 0; j < nLen; i++, j += 4)
  266. {
  267. pcbOutput[j] = (BYTE)(pcbInput[i] & 0xff);
  268. pcbOutput[j + 1] = (BYTE)((pcbInput[i] >> 8) & 0xff);
  269. pcbOutput[j + 2] = (BYTE)((pcbInput[i] >> 16) & 0xff);
  270. pcbOutput[j + 3] = (BYTE)((pcbInput[i] >> 24) & 0xff);
  271. }
  272. return;
  273. }
  274. //解码函数
  275. VOID CMD5Aide::Decode(ULONG * pcbOutput, BYTE * pcbInput, UINT nLen)
  276. {
  277. UINT i, j;
  278. for (i = 0, j = 0; j < nLen; i++, j += 4)
  279. {
  280. pcbOutput[i] = ((ULONG)pcbInput[j]) | (((ULONG)pcbInput[j + 1]) << 8) |
  281. (((ULONG)pcbInput[j + 2]) << 16) | (((ULONG)pcbInput[j + 3]) << 24);
  282. }
  283. return;
  284. }
  285. //拷贝函数
  286. VOID CMD5Aide::MD5Memcpy(BYTE * pcbOutput, BYTE * pcbInput, UINT nLen)
  287. {
  288. for (UINT i = 0; i < nLen; i++) pcbOutput[i] = pcbInput[i];
  289. }
  290. //置位函数
  291. VOID CMD5Aide::MD5Memset(BYTE * pcbOutput, INT nValue, UINT nLen)
  292. {
  293. for (UINT i = 0; i < nLen; i++) ((char *)pcbOutput)[i] = (char)nValue;
  294. }
  295. //////////////////////////////////////////////////////////////////////////////////
  296. //构造函数
  297. CWHEncrypt::CWHEncrypt()
  298. {
  299. }
  300. //析构函数
  301. CWHEncrypt::~CWHEncrypt()
  302. {
  303. }
  304. const char CWHEncrypt::HEX[16] = {
  305. '0', '1', '2', '3',
  306. '4', '5', '6', '7',
  307. '8', '9', 'a', 'b',
  308. 'c', 'd', 'e', 'f'
  309. };
  310. /* Convert byte array to hex string. */
  311. std::string CWHEncrypt::bytesToHexString(const byte* input, size_t length)
  312. {
  313. std::string str="";
  314. str.reserve(length << 1);
  315. for (size_t i = 0; i < length; ++i) {
  316. int t = input[i];
  317. int a = t / 16;
  318. int b = t % 16;
  319. str.append(1, HEX[a]);
  320. str.append(1, HEX[b]);
  321. }
  322. return str;
  323. }
  324. //生成密文
  325. bool CWHEncrypt::MD5Encrypt(LPCSTR pszSourceData, TCHAR szMD5Result[LEN_MD5])
  326. {
  327. //变量定义
  328. CMD5Aide MD5Aide;
  329. UCHAR szResult[16];
  330. //加密密文
  331. MD5Aide.MD5Update((BYTE *)pszSourceData, lstrlenA(pszSourceData)*sizeof(CHAR));
  332. MD5Aide.MD5Final(szResult);
  333. //输出结果
  334. szMD5Result[0] = 0;
  335. //std::string str=bytesToHexString(szResult, 16);
  336. for (INT i = 0; i < 16; i++) _stprintf(&szMD5Result[i * 2], TEXT("%02X"), szResult[i]);
  337. return true;
  338. }
  339. //生成密文
  340. bool CWHEncrypt::MD5Encrypt(LPCTSTR pszSourceData, TCHAR szMD5Result[LEN_MD5])
  341. {
  342. //变量定义
  343. CMD5Aide MD5Aide;
  344. UCHAR szResult[16];
  345. CT2CA strSrcData(pszSourceData);
  346. //加密密文
  347. MD5Aide.MD5Update((BYTE *)((LPCSTR)strSrcData), lstrlenA(strSrcData)*sizeof(CHAR));
  348. MD5Aide.MD5Final(szResult);
  349. //输出结果
  350. szMD5Result[0] = 0;
  351. for (INT i = 0; i < 16; i++) _stprintf(&szMD5Result[i * 2], TEXT("%02X"), szResult[i]);
  352. return true;
  353. }
  354. //生成密文
  355. bool CWHEncrypt::XorEncrypt(LPCTSTR pszSourceData, LPTSTR pszEncrypData, WORD wMaxCount)
  356. {
  357. //变量定义
  358. CT2CW strSrcData(pszSourceData);
  359. WCHAR szEncrypData[MAX_ENCRYPT_LEN + 1] = L"";
  360. //生成密钥
  361. WORD wRandKey[ENCRYPT_KEY_LEN];
  362. wRandKey[0] = lstrlenW(strSrcData);
  363. for (WORD i = 1; i<CountArray(wRandKey); i++) wRandKey[i] = rand() % 0xFFFF;
  364. //步骤准备
  365. WORD wTempCode = 0;
  366. WORD wTimes = ((wRandKey[0] + ENCRYPT_KEY_LEN - 1) / ENCRYPT_KEY_LEN)*ENCRYPT_KEY_LEN;
  367. //参数效验
  368. ASSERT((wTimes * 8 + 1) <= wMaxCount);
  369. if ((wTimes * 8 + 1)>wMaxCount) return false;
  370. //生成密文
  371. for (WORD i = 0; i < wTimes; i++)
  372. {
  373. if (i < wRandKey[0]) wTempCode = strSrcData[i] ^ wRandKey[i%ENCRYPT_KEY_LEN];
  374. else wTempCode = wRandKey[i%ENCRYPT_KEY_LEN] ^ (WORD)(rand() % 0xFFFF);
  375. swprintf(szEncrypData + i * 8, L"%04X%04X", wRandKey[i%ENCRYPT_KEY_LEN], wTempCode);
  376. }
  377. //字符转换
  378. CW2CT strEncrypData(szEncrypData);
  379. lstrcpyn(pszEncrypData, strEncrypData, wMaxCount);
  380. return true;
  381. }
  382. //解开密文
  383. bool CWHEncrypt::XorCrevasse(LPCTSTR pszEncrypData, LPTSTR pszSourceData, WORD wMaxCount)
  384. {
  385. //设置结果
  386. pszSourceData[0] = 0;
  387. //变量定义
  388. CT2CW strEncrypData(pszEncrypData);
  389. WCHAR szSrcData[MAX_SOURCE_LEN] = L"";
  390. //效验长度
  391. WORD wEncrypPassLen = lstrlenW(strEncrypData);
  392. if (wEncrypPassLen < ENCRYPT_KEY_LEN * 8) return false;
  393. //提取长度
  394. WCHAR szTempBuffer[5] = L"";
  395. szTempBuffer[CountArray(szTempBuffer) - 1] = 0;
  396. CopyMemory(szTempBuffer, (LPCWSTR)strEncrypData, sizeof(WCHAR)* 4);
  397. //获取长度
  398. WCHAR * pEnd = NULL;
  399. WORD wSoureLength = (WORD)wcstol(szTempBuffer, &pEnd, 16);
  400. //长度效验
  401. ASSERT(wEncrypPassLen == (((wSoureLength + ENCRYPT_KEY_LEN - 1) / ENCRYPT_KEY_LEN)*ENCRYPT_KEY_LEN * 8));
  402. if (wEncrypPassLen != (((wSoureLength + ENCRYPT_KEY_LEN - 1) / ENCRYPT_KEY_LEN)*ENCRYPT_KEY_LEN * 8)) return false;
  403. //长度效验
  404. ASSERT((wSoureLength + 1) <= wMaxCount);
  405. if ((wSoureLength + 1) > wMaxCount) return false;
  406. //解开密码
  407. for (INT i = 0; i < wSoureLength; i++)
  408. {
  409. //获取密钥
  410. WCHAR szKeyBuffer[5];
  411. szKeyBuffer[CountArray(szKeyBuffer) - 1] = 0;
  412. szTempBuffer[CountArray(szTempBuffer) - 1] = 0;
  413. CopyMemory(szKeyBuffer, (LPCWSTR)(strEncrypData + i * 8), sizeof(WCHAR)* 4);
  414. CopyMemory(szTempBuffer, (LPCWSTR)strEncrypData + i * 8 + 4, sizeof(WCHAR)* 4);
  415. //提取密钥
  416. WCHAR wKey = (WCHAR)wcstol(szKeyBuffer, &pEnd, 16);
  417. WCHAR wEncrypt = (WCHAR)wcstol(szTempBuffer, &pEnd, 16);
  418. //生成原文
  419. szSrcData[i] = (WCHAR)((WCHAR)wKey ^ (WCHAR)wEncrypt);
  420. }
  421. //终止字符
  422. szSrcData[wSoureLength] = 0;
  423. //字符转换
  424. CW2CT strSrcData(szSrcData);
  425. lstrcpyn(pszSourceData, strSrcData, wMaxCount);
  426. return true;
  427. }
  428. //生成密文
  429. bool CWHEncrypt::MapEncrypt(LPCTSTR pszSourceData, LPTSTR pszEncrypData, WORD wMaxCount)
  430. {
  431. //效验参数
  432. ASSERT(wMaxCount > lstrlen(pszEncrypData));
  433. ASSERT((pszEncrypData != NULL) && (pszSourceData != NULL));
  434. //变量定义
  435. INT nLength = lstrlen(pszSourceData);
  436. BYTE * pcbEncrypData = (BYTE *)pszEncrypData;
  437. BYTE * pcbSourceData = (BYTE *)pszSourceData;
  438. //解密数据
  439. for (UINT i = 0; i < nLength*sizeof(TCHAR); i++)
  440. {
  441. BYTE cbIndex = pcbSourceData[i];
  442. pcbEncrypData[i] = g_cbEncryptMap[cbIndex];
  443. }
  444. //设置结果
  445. pszEncrypData[nLength] = 0;
  446. return true;
  447. }
  448. //解开密文
  449. bool CWHEncrypt::MapCrevasse(LPCTSTR pszEncrypData, LPTSTR pszSourceData, WORD wMaxCount)
  450. {
  451. //效验参数
  452. ASSERT(wMaxCount > lstrlen(pszEncrypData));
  453. ASSERT((pszEncrypData != NULL) && (pszSourceData != NULL));
  454. //变量定义
  455. INT nLength = lstrlen(pszEncrypData);
  456. BYTE * pcbEncrypData = (BYTE *)pszEncrypData;
  457. BYTE * pcbSourceData = (BYTE *)pszSourceData;
  458. //解密数据
  459. for (UINT i = 0; i < nLength*sizeof(TCHAR); i++)
  460. {
  461. BYTE cbIndex = pcbEncrypData[i];
  462. pcbSourceData[i] = g_cbCrevasseMap[cbIndex];
  463. }
  464. //设置结果
  465. pszSourceData[nLength] = 0;
  466. return true;
  467. }
  468. //////////////////////////////////////////////////////////////////////////////////