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

外挂编程

开发平台:

Windows_Unix

  1. #include "seal.h"
  2. /* seal.c - SEAL encryption algorithm */
  3. /* SEAL */
  4. #include <stdio.h>
  5. #define ALG_OK 0
  6. #define ALG_NOTOK 1
  7. #define ROT2(x) (((x) >>2) | ((x) << 30))
  8. #define ROT8(x) (((x) >>8) | ((x) << 24))
  9. #define ROT9(x) (((x) >>9) | ((x) << 23))
  10. #define ROT16(x) (((x) >> 16) | ((x) << 16))
  11. #define ROT24(x) (((x) >> 24) | ((x) << 8))
  12. #define ROT27(x) (((x) >> 27) | ((x) << 5))
  13. #define WORD(cp) ((cp[0]<<24)|(cp[1]<<16)|(cp[2]<<8)|(cp[3]))
  14. #define F1(x, y, z) (((x) & (y)) | ((~(x)) & (z)))
  15. #define F2(x, y, z) ((x) ^ (y) ^ (z))
  16. #define F3(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
  17. #define F4(x, y, z) ((x) ^ (y) ^ (z))
  18. int g(unsigned char *in,int i,dword *h)
  19. {
  20. dword h0,h1,h2,h3,h4,a,b,c,d,e,temp;
  21. unsigned char *kp;
  22. dword w[80];
  23. kp = in;
  24. h0 = WORD(kp); kp += 4;
  25. h1 = WORD(kp); kp += 4;
  26. h2 = WORD(kp); kp += 4;
  27. h3 = WORD(kp); kp += 4;
  28. h4 = WORD(kp); kp += 4;
  29. w[0] = i;
  30. for (i=1;i<16;i++) w[i] = 0;
  31. for (i=16;i<80;i++) w[i] = w[i-3]^w[i-8]^w[i-14]^w[i-16];
  32. a = h0; b = h1; c = h2; d = h3; e = h4;
  33. for(i=0;i<20;i++)
  34. {
  35. temp = ROT27(a) + F1(b, c, d) + e + w[i] + 0x5a827998;
  36. e = d; d = c; c = ROT2(b); b = a; a = temp;
  37. }
  38. for (i=20;i<40;i++)
  39. {
  40. temp = ROT27(a) + F2(b, c, d) + e + w[i] + 0x6ef9eba1;
  41. e = d; d = c; c = ROT2(b); b = a; a = temp;
  42. }
  43. for (i=40;i<60;i++)
  44. {
  45. temp = ROT27(a) + F3(b, c, d) + e + w[i] + 0x7f1cbcdc;
  46. e = d; d = c; c = ROT2(b); b = a; a = temp;
  47. }
  48. for (i=60;i<80;i++)
  49. {
  50. temp = ROT27(a) + F4(b, c, d) + e + w[i] + 0xaa62d1d6;
  51. e = d; d = c; c = ROT2(b); b = a; a = temp;
  52. }
  53. h[0] = h0+a; h[1] = h1+b; h[2] = h2+c; h[3] = h3+d; h[4] = h4+e;
  54. return (ALG_OK);
  55. }
  56. /*dword seal_gamma (unsigned char *a,int i)
  57. {
  58. dword h[5];
  59. (void) g(a, i/5, h);
  60. return h[i % 5];
  61. }*/
  62. int seal_init( seal_ctx *result, unsigned char *key )
  63. {
  64. int i;
  65. dword h[5];
  66. for (i=0;i<510;i+=5)
  67.  g(key, i/5, &(result->t[i]));
  68. // horrible special case for the end
  69. g(key, 510/5, h);
  70. for(i=510;i<512;i++)
  71.  result->t[i] = h[i-510];
  72. // 0x1000 mod 5 is +1, so have horrible special case for the start
  73. g(key, (-1+0x1000)/5, h);
  74. for (i=0;i<4;i++)
  75.  result->s[i] = h[i+1];
  76. for (i=4;i<254;i+=5)
  77.  g(key, (i+0x1000)/5, &(result->s[i]));
  78. // horrible special case for the end
  79. g(key, (254+0x1000)/5, h);
  80. for (i=254;i<256;i++)
  81.  result->s[i] = h[i-254];
  82. // 0x2000 mod 5 is +2, so have horrible special case at the start
  83. g(key, (-2+0x2000)/5, h);
  84. for(i=0;i<3;i++)
  85.  result->r[i] = h[i+2];
  86. for (i=3;i<13;i+=5)
  87.  g(key,(i+0x2000)/5,&(result->r[i]));
  88. // horrible special case for the end
  89. g(key, (13+0x2000)/5, h);
  90. for (i=13;i<16;i++)
  91.  result->r[i] = h[i-13];
  92. return (ALG_OK);
  93. }
  94. int seal(seal_ctx *key, dword in, dword *out)
  95. {
  96. int i,j,l;
  97. dword a,b,c,d,n1,n2,n3,n4,*wp;
  98. unsigned short p,q;
  99. wp = out;
  100. for (l=0;l<4;l++)
  101. {
  102. a = in ^ key->r[4*l];
  103. b = ROT8(in) ^ key->r[4*l+1];
  104. c = ROT16(in) ^ key->r[4*l+2];
  105. d = ROT24(in) ^ key->r[4*l+3];
  106. }
  107. for (j=0;j<2;j++)
  108. {
  109. p = a & 0x7fc;
  110. b += key->t[p/4];
  111. a = ROT9(a);
  112. p = b & 0x7fc;
  113. c += key->t[p/4];
  114. b = ROT9(b);
  115. p = c & 0x7fc;
  116. d += key->t[p/4];
  117. c = ROT9(c);
  118. p = d & 0x7fc;
  119. a += key->t[p/4];
  120. d = ROT9(d);
  121. n1 = d; n2=b; n3=a; n4=c;
  122. p = a & 0x7fc;
  123. b += key->t[p/4];
  124. a = ROT9(a);
  125. p = b & 0x7fc;
  126. c += key->t[p/4];
  127. b = ROT9(b);
  128. p = c & 0x7fc;
  129. d += key->t[p/4];
  130. c = ROT9(c);
  131. p = d & 0x7fc;
  132. a += key->t[p/4];
  133. d = ROT9(d);
  134. for (i=0;i<64;i++)
  135. {
  136. p = a & 0x7fc;
  137. b += key->t[p/4];
  138. a = ROT9(a);
  139. b ^= a;
  140. q = b & 0x7fc;
  141. c ^= key->t[q/4];
  142. b = ROT9(b);
  143. c += b;
  144. p = (p+c) & 0x7fc;
  145. d += key->t[p/4];
  146. c = ROT9(c);
  147. d ^= c;
  148. q = (q+d) & 0x7fc;
  149. a ^= key->t[q/4];
  150. d = ROT9(d);
  151. a += d;
  152. p = (p+a) & 0x7fc;
  153. b ^= key->t[p/4];
  154. a = ROT9(a);
  155. q = (q+b) & 0x7fc;
  156. c += key->t[q/4];
  157. b = ROT9(b);
  158. p = (p+c) & 0x7fc;
  159. d ^= key->t[p/4];
  160. c = ROT9(c);
  161. q = (q+d) & 0x7fc;
  162. a += key->t[q/4];
  163. d = ROT9(d);
  164. *wp = b + key->s[4*i]; wp++;
  165. *wp = c ^ key->s[4*i+1]; wp++;
  166. *wp = d + key->s[4*i+2]; wp++;
  167. *wp = a ^ key->s[4*i+3]; wp++;
  168. if(i&1)
  169. {
  170. a += n3;
  171. c += n4;
  172. }
  173. else
  174. {
  175. a += n1;
  176. c += n2;
  177. }
  178. }
  179. }
  180. return (ALG_OK);
  181. }
  182. void seal_refill_buffer(seal_ctx *c){
  183. seal(c,c->counter,c->ks_buf);
  184. c->counter++;
  185. c->ks_pos = 0;
  186. }
  187. void seal_key(seal_ctx *c, unsigned char *key)
  188. {
  189. seal_init(c,key);
  190. c->counter = 0;
  191. c->ks_pos = WORDS_PER_SEAL_CALL;
  192. }
  193. void seal_encrypt(seal_ctx *c, dword *data_ptr, int w)
  194. {
  195. int i;
  196. for(i=0;i<w;i++)
  197. {
  198. if(c->ks_pos>=WORDS_PER_SEAL_CALL) seal_refill_buffer(c);
  199. data_ptr[i]^=c->ks_buf[c->ks_pos];
  200. c->ks_pos++;
  201. }
  202. }
  203. /*void seal_decrypt(seal_ctx *c, dword *data_ptr, int w) {
  204. seal_encrypt(c,data_ptr,w);
  205. }*/
  206. /*void seal_resynch(seal_ctx *c, dword synch_word){
  207. c->counter = synch_word;
  208. c->ks_pos = WORDS_PER_SEAL_CALL;
  209. }*/