mcg_cipher.c.svn-base
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:9k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. /* MacGuffin Cipher
  2. * 10/3/94 Matt Blaze
  3. * (fast, unrolled version)
  4. */
  5. //
  6. // Changed to conform to padded packets emulator by Jack Applegame
  7. // $Id: mcg_cipher.c 5135 2006-11-18 22:06:15Z mouseland $
  8. // 
  9. #include "mcg_cipher.h"
  10. #define TSIZE (1<<16)
  11. #define IN00 0x0036
  12. #define IN01 0x06C0
  13. #define IN02 0x6900
  14. #define OUT0 0x000F
  15. #define IN10 0x5048
  16. #define IN11 0x2106
  17. #define IN12 0x8411
  18. #define OUT1 0x00F0
  19. #define IN20 0x8601
  20. #define IN21 0x4828
  21. #define IN22 0x10C4
  22. #define OUT2 0x3300
  23. #define IN30 0x2980
  24. #define IN31 0x9011
  25. #define IN32 0x022A
  26. #define OUT3 0xCC00
  27. word sBoxes[8][64]=
  28. {
  29. {0x0002, 0x0000, 0x0000, 0x0003, 0x0003, 0x0001, 0x0001, 0x0000,
  30.  0x0000, 0x0002, 0x0003, 0x0000, 0x0003, 0x0003, 0x0002, 0x0001,
  31.  0x0001, 0x0002, 0x0002, 0x0000, 0x0000, 0x0002, 0x0002, 0x0003,
  32.  0x0001, 0x0003, 0x0003, 0x0001, 0x0000, 0x0001, 0x0001, 0x0002,
  33.  0x0000, 0x0003, 0x0001, 0x0002, 0x0002, 0x0002, 0x0002, 0x0000,
  34.  0x0003, 0x0000, 0x0000, 0x0003, 0x0000, 0x0001, 0x0003, 0x0001,
  35.  0x0003, 0x0001, 0x0002, 0x0003, 0x0003, 0x0001, 0x0001, 0x0002,
  36.  0x0001, 0x0002, 0x0002, 0x0000, 0x0001, 0x0000, 0x0000, 0x0003},
  37. {0x000C, 0x0004, 0x0004, 0x000C, 0x0008, 0x0000, 0x0008, 0x0004,
  38.  0x0000, 0x000C, 0x000C, 0x0000, 0x0004, 0x0008, 0x0000, 0x0008,
  39.  0x000C, 0x0008, 0x0004, 0x0000, 0x0000, 0x0004, 0x000C, 0x0008,
  40.  0x0008, 0x0000, 0x0000, 0x000C, 0x0004, 0x000C, 0x0008, 0x0004,
  41.  0x0000, 0x000C, 0x0008, 0x0008, 0x0004, 0x0008, 0x000C, 0x0004,
  42.  0x0008, 0x0004, 0x0000, 0x000C, 0x000C, 0x0000, 0x0004, 0x0000,
  43.  0x0004, 0x000C, 0x0008, 0x0000, 0x0008, 0x0004, 0x0000, 0x0008,
  44.  0x000C, 0x0000, 0x0004, 0x0004, 0x0000, 0x0008, 0x000C, 0x000C},
  45. {0x0020, 0x0030, 0x0000, 0x0010, 0x0030, 0x0000, 0x0020, 0x0030,
  46.  0x0000, 0x0010, 0x0010, 0x0000, 0x0030, 0x0000, 0x0010, 0x0020,
  47.  0x0010, 0x0000, 0x0030, 0x0020, 0x0020, 0x0010, 0x0010, 0x0020,
  48.  0x0030, 0x0020, 0x0000, 0x0030, 0x0000, 0x0030, 0x0020, 0x0010,
  49.  0x0030, 0x0010, 0x0000, 0x0020, 0x0000, 0x0030, 0x0030, 0x0000,
  50.  0x0020, 0x0000, 0x0030, 0x0030, 0x0010, 0x0020, 0x0000, 0x0010,
  51.  0x0030, 0x0000, 0x0010, 0x0030, 0x0000, 0x0020, 0x0020, 0x0010,
  52.  0x0010, 0x0030, 0x0020, 0x0010, 0x0020, 0x0000, 0x0010, 0x0020},
  53. {0x0040, 0x00C0, 0x00C0, 0x0080, 0x0080, 0x00C0, 0x0040, 0x0040,
  54.  0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0080, 0x0040,
  55.  0x0040, 0x0000, 0x0000, 0x0040, 0x0080, 0x0000, 0x0040, 0x0080,
  56.  0x00C0, 0x0040, 0x0080, 0x0080, 0x0000, 0x0080, 0x00C0, 0x00C0,
  57.  0x0080, 0x0040, 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000,
  58.  0x0080, 0x0080, 0x00C0, 0x0040, 0x0040, 0x00C0, 0x00C0, 0x0080,
  59.  0x00C0, 0x00C0, 0x0040, 0x0000, 0x0040, 0x0040, 0x0080, 0x00C0,
  60.  0x0040, 0x0080, 0x0000, 0x0040, 0x0080, 0x0000, 0x0000, 0x0080},
  61. {0x0000, 0x0200, 0x0200, 0x0300, 0x0000, 0x0000, 0x0100, 0x0200,
  62.  0x0100, 0x0000, 0x0200, 0x0100, 0x0300, 0x0300, 0x0000, 0x0100,
  63.  0x0200, 0x0100, 0x0100, 0x0000, 0x0100, 0x0300, 0x0300, 0x0200,
  64.  0x0300, 0x0100, 0x0000, 0x0300, 0x0200, 0x0200, 0x0300, 0x0000,
  65.  0x0000, 0x0300, 0x0000, 0x0200, 0x0100, 0x0200, 0x0300, 0x0100,
  66.  0x0200, 0x0100, 0x0300, 0x0200, 0x0100, 0x0000, 0x0200, 0x0300,
  67.  0x0300, 0x0000, 0x0300, 0x0300, 0x0200, 0x0000, 0x0100, 0x0300,
  68.  0x0000, 0x0200, 0x0100, 0x0000, 0x0000, 0x0100, 0x0200, 0x0100},
  69. {0x0800, 0x0800, 0x0400, 0x0C00, 0x0800, 0x0000, 0x0C00, 0x0000,
  70.  0x0C00, 0x0400, 0x0000, 0x0800, 0x0000, 0x0C00, 0x0800, 0x0400,
  71.  0x0000, 0x0000, 0x0C00, 0x0400, 0x0400, 0x0C00, 0x0000, 0x0800,
  72.  0x0800, 0x0000, 0x0400, 0x0C00, 0x0400, 0x0400, 0x0C00, 0x0800,
  73.  0x0C00, 0x0000, 0x0800, 0x0400, 0x0C00, 0x0000, 0x0400, 0x0800,
  74.  0x0000, 0x0C00, 0x0800, 0x0400, 0x0800, 0x0C00, 0x0400, 0x0800,
  75.  0x0400, 0x0C00, 0x0000, 0x0800, 0x0000, 0x0400, 0x0800, 0x0400,
  76.  0x0400, 0x0000, 0x0C00, 0x0000, 0x0C00, 0x0800, 0x0000, 0x0C00},
  77. {0x0000, 0x3000, 0x3000, 0x0000, 0x0000, 0x3000, 0x2000, 0x1000,
  78.  0x3000, 0x0000, 0x0000, 0x3000, 0x2000, 0x1000, 0x3000, 0x2000,
  79.  0x1000, 0x2000, 0x2000, 0x1000, 0x3000, 0x1000, 0x1000, 0x2000,
  80.  0x1000, 0x0000, 0x2000, 0x3000, 0x0000, 0x2000, 0x1000, 0x0000,
  81.  0x1000, 0x0000, 0x0000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2000,
  82.  0x2000, 0x1000, 0x1000, 0x0000, 0x1000, 0x2000, 0x2000, 0x1000,
  83.  0x2000, 0x3000, 0x3000, 0x1000, 0x0000, 0x0000, 0x2000, 0x3000,
  84.  0x0000, 0x2000, 0x1000, 0x0000, 0x3000, 0x1000, 0x0000, 0x2000},
  85. {0xC000, 0x4000, 0x0000, 0xC000, 0x8000, 0xC000, 0x0000, 0x8000,
  86.  0x0000, 0x8000, 0xC000, 0x4000, 0xC000, 0x4000, 0x4000, 0x0000,
  87.  0x8000, 0x8000, 0xC000, 0x4000, 0x4000, 0x0000, 0x8000, 0xC000,
  88.  0x4000, 0x0000, 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x0000,
  89.  0x4000, 0x0000, 0xC000, 0x4000, 0x0000, 0x8000, 0x4000, 0x4000,
  90.  0xC000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0xC000,
  91.  0x0000, 0xC000, 0x0000, 0x8000, 0x8000, 0xC000, 0xC000, 0x0000,
  92.  0xC000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x8000, 0xC000}
  93. };
  94. word sTable[TSIZE];
  95. void MCGInit(void)
  96. {
  97. dword i,j;
  98. static int sBits[8][6]=  // p69E404 (p69E414 - 0x10)
  99. {
  100. {0x2, 0x5, 0x6, 0x9, 0xB , 0xD},
  101. {0x1, 0x4, 0x7, 0xA, 0x8, 0xE},
  102. {0x3, 0x6, 0x8, 0xD, 0x0, 0xF},
  103. {0xC, 0xE, 0x1, 0x2, 0x4, 0xA},
  104. {0x0, 0xA, 0x3, 0xE, 0x6, 0xC},
  105. {0x7, 0x8, 0xC, 0xF, 0x1, 0x5},
  106. {0x9, 0xF, 0x5, 0xB, 0x2, 0x7},
  107. {0xB, 0xD, 0x0, 0x4, 0x3, 0x9}
  108. };
  109. for(i = 0; i<TSIZE; i++)
  110. {
  111. sTable[i] = 0;
  112. for(j = 0; j < 8; j++)
  113. sTable[i] |=
  114. sBoxes[j][((i >> sBits[j][0]) & 1)
  115. |(((i >> sBits[j][1]) & 1) << 1)
  116. |(((i >> sBits[j][2]) & 1) << 2)
  117. |(((i >> sBits[j][3]) & 1) << 3)
  118. |(((i >> sBits[j][4]) & 1) << 4)
  119. |(((i >> sBits[j][5]) & 1) << 5)];
  120. }
  121. }
  122. void MCGKeyset(byte* Key, MCGKey* eKey)
  123. {
  124. int i,j;
  125. byte k[2][8];
  126. MCGInit();
  127. for(i=0;i<8;i++)
  128. {
  129. k[0][i] = Key[i];
  130. k[1][i] = Key[i+8];
  131. }
  132. for(i=0;i<KSIZE;i++) eKey->Val[i] = 0;
  133. for(i=0;i<2;i++)
  134. for(j=0;j<32;j++)
  135. {
  136. MCGBlockEncrypt0(k[i],eKey);
  137. eKey->Val[j*3+0] ^= ((word*)k[i])[0];
  138. eKey->Val[j*3+1] ^= ((word*)k[i])[1];
  139. eKey->Val[j*3+2] ^= ((word*)k[i])[2];
  140. }
  141. }
  142. void MCGBlockEncrypt0(byte* Blk, MCGKey* eKey)
  143. {
  144. word r0, r1, r2, r3, a, b, c;
  145. int i;
  146. word *ek = eKey->Val;
  147. r0 = ((word*)Blk)[0];
  148. r1 = ((word*)Blk)[1];
  149. r2 = ((word*)Blk)[2];
  150. r3 = ((word*)Blk)[3];
  151. for(i=0; i<ROUNDS/4; i++)
  152. {
  153. a = r1 ^ *(ek++); b = r2 ^ *(ek++); c = r3 ^ *(ek++);
  154. r0 ^= ((OUT0 & sTable[(a & IN00) | (b & IN01) | (c & IN02)])
  155. |(OUT1 & sTable[(a & IN10) | (b & IN11) | (c & IN12)])
  156. |(OUT2 & sTable[(a & IN20) | (b & IN21) | (c & IN22)])
  157. |(OUT3 & sTable[(a & IN30) | (b & IN31) | (c & IN32)]));
  158. a = r2 ^ *(ek++); b = r3 ^ *(ek++); c = r0 ^ *(ek++);
  159. r1 ^= ((OUT0 & sTable[(a & IN00) | (b & IN01) | (c & IN02)])
  160. |(OUT1 & sTable[(a & IN10) | (b & IN11) | (c & IN12)])
  161. |(OUT2 & sTable[(a & IN20) | (b & IN21) | (c & IN22)])
  162. |(OUT3 & sTable[(a & IN30) | (b & IN31) | (c & IN32)]));
  163. a = r3 ^ *(ek++); b = r0 ^ *(ek++); c = r1 ^ *(ek++);
  164. r2 ^= ((OUT0 & sTable[(a & IN00) | (b & IN01) | (c & IN02)])
  165. |(OUT1 & sTable[(a & IN10) | (b & IN11) | (c & IN12)])
  166. |(OUT2 & sTable[(a & IN20) | (b & IN21) | (c & IN22)])
  167. |(OUT3 & sTable[(a & IN30) | (b & IN31) | (c & IN32)]));
  168. a = r0 ^ *(ek++); b = r1 ^ *(ek++); c = r2 ^ *(ek++);
  169. r3 ^= ((OUT0 & sTable[(a & IN00) | (b & IN01) | (c & IN02)])
  170. |(OUT1 & sTable[(a & IN10) | (b & IN11) | (c & IN12)])
  171. |(OUT2 & sTable[(a & IN20) | (b & IN21) | (c & IN22)])
  172. |(OUT3 & sTable[(a & IN30) | (b & IN31) | (c & IN32)]));
  173. }
  174. ((word*)Blk)[0] = r0;
  175. ((word*)Blk)[1] = r1;
  176. ((word*)Blk)[2] = r2;
  177. ((word*)Blk)[3] = r3;
  178. }
  179. void MCGBlockEncrypt1(byte* Blk, MCGKey* eKey)
  180. {
  181. word r0, r1, r2, r3, a, b, c;
  182. int i;
  183. word *ek = eKey->Val+KSIZE-1;
  184. r0 = ((word*)Blk)[1];
  185. r1 = ((word*)Blk)[2];
  186. r2 = ((word*)Blk)[3];
  187. r3 = ((word*)Blk)[0];
  188. for(i=0; i<ROUNDS/4; i++)
  189. {
  190. //di - c; cx - b; si - a;
  191. c = r1 ^ *(ek--); b = r0 ^ *(ek--); a = r3 ^ *(ek--);
  192. r2 ^= ((OUT0 & sTable[(a & IN00)|(b & IN01)|(c & IN02)])
  193. |(OUT1 & sTable[(a & IN10)|(b & IN11)|(c & IN12)])
  194. |(OUT2 & sTable[(a & IN20)|(b & IN21)|(c & IN22)])
  195. |(OUT3 & sTable[(a & IN30)|(b & IN31)|(c & IN32)]));
  196. c = r0 ^ *(ek--); b = r3 ^ *(ek--); a = r2 ^ *(ek--);
  197. r1 ^= ((OUT0 & sTable[(a & IN00)|(b & IN01)|(c & IN02)])
  198. |(OUT1 & sTable[(a & IN10)|(b & IN11)|(c & IN12)])
  199. |(OUT2 & sTable[(a & IN20)|(b & IN21)|(c & IN22)])
  200. |(OUT3 & sTable[(a & IN30)|(b & IN31)|(c & IN32)]));
  201. c = r3 ^ *(ek--); b = r2 ^ *(ek--); a = r1 ^ *(ek--);
  202. r0 ^= ((OUT0 & sTable[(a & IN00)|(b & IN01)|(c & IN02)])
  203. |(OUT1 & sTable[(a & IN10)|(b & IN11)|(c & IN12)])
  204. |(OUT2 & sTable[(a & IN20)|(b & IN21)|(c & IN22)])
  205. |(OUT3 & sTable[(a & IN30)|(b & IN31)|(c & IN32)]));
  206. c = r2 ^ *(ek--); b = r1 ^ *(ek--); a = r0 ^ *(ek--);
  207. r3 ^= ((OUT0 & sTable[(a & IN00)|(b & IN01)|(c & IN02)])
  208. |(OUT1 & sTable[(a & IN10)|(b & IN11)|(c & IN12)])
  209. |(OUT2 & sTable[(a & IN20)|(b & IN21)|(c & IN22)])
  210. |(OUT3 & sTable[(a & IN30)|(b & IN31)|(c & IN32)]));
  211. }
  212. ((word*)Blk)[1] = r0;
  213. ((word*)Blk)[2] = r1;
  214. ((word*)Blk)[3] = r2;
  215. ((word*)Blk)[0] = r3;
  216. }