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

外挂编程

开发平台:

Windows_Unix

  1. /*
  2.  * turtle.c
  3.  * Matt Blaze, September, 1996
  4.  *
  5.  * This is the basic turtle/hare cipher reference implementation
  6.  * with a simple key schedule.
  7.  *
  8.  * Turtle blocksize can be any power of two words >= 4;
  9.  * the wordsize is hardcoded in turtle.h.  8 bits is the default.
  10.  *
  11.  * This code turtle encrypts 8-word blocks on a pl00 at about 3Mbps.  It
  12.  * can probably be made a couple times faster by unrolling the recursive
  13.  * calls. Hare runs at about 9Mbps.
  14.  */
  15. #include <stdio.h>
  16. #include "turtle.h"
  17. static int r;
  18. static void keyperm(TURTLEWORD sbox[][NTURTLEWORDS], TURTLEWORD *key, int len, int n);
  19. static int r_turtle_encrypt(TURTLEWORD *in, TURTLEWORD *out, int n, TK *key);
  20. /*
  21.  * Basic turtle encrypt
  22.  * (encrypts blk in place)
  23.  */
  24. int turtle_encrypt(TURTLEWORD *blk, TK *key) {
  25.     int nn, i;
  26.     TURTLEWORD buf[TURTLEMAXN];
  27.     if ((key==NULL)||(blk==NULL)) return -1;
  28.     r=0;
  29.     nn=key->n/2;
  30.     r_turtle_encrypt(&(blk[0]),buf,nn,key);
  31.     for (i=0; i<nn; i++) blk[i+nn] ^= buf[i];
  32.     r_turtle_encrypt(&(blk[nn]),buf,nn,key);
  33.     for (i=0; i<nn; i++) blk[i] ^= buf[i];
  34.     r_turtle_encrypt(&(blk[0]),buf,nn,key);
  35.     for (i=0; i<nn; i++) blk[i+nn] ^= buf[i];
  36.     r_turtle_encrypt(&(blk[nn]),buf,nn,key);
  37.     for (i=0; i<nn; i++) blk[i] ^= buf[i];
  38.     return 0;
  39. }
  40. /*
  41.  * Basic turtle decrypt
  42.  * (decrypts blk in place)
  43.  */
  44. int turtle_decrypt(TURTLEWORD *blk, TK *key) {
  45.     int nn, i;
  46.     unsigned char buf[TURTLEMAXN];
  47.     if ((key==NULL)||(blk==NULL)) return -1;
  48.     nn=key->n/2;
  49.     r=key->rr[3]; /* we have to use the key schedule backwards */
  50.   /* but only for the OUTERMOST recursive shell */
  51.     r_turtle_encrypt(&(blk[nn]),buf,nn,key);
  52.     for (i=0; i<nn; i++)
  53.         blk[i] ^= buf[i];
  54.     r=key->rr[2];
  55.     r_turtle_encrypt(&(blk[0]),buf,nn,key);
  56.     for (i=0; i<nn; i++) blk[i+nn] ^= buf[i];
  57.     r=key->rr[1];
  58.     r_turtle_encrypt(&(blk[nn]),buf,nn,key);
  59.     for (i=0; i<nn; i++) blk[i] ^= buf[i];
  60.     r=0;
  61.     r_turtle_encrypt(&(blk[0]),buf,nn,key);
  62.     for (i=0; i<nn; i++) blk[i+nn] ^= buf[i];
  63.     return 0;
  64. }
  65. /*
  66.  * create turtle key from short key.
  67.  * n must be a power of 2 and >= 4.
  68.  */
  69. int turtle_key(TURTLEWORD *shortkey, int len, TK *key, int n) {
  70.     int i, j, nn;
  71.     TURTLEWORD other, t;
  72.     HK harekey;
  73.     if ((n<4)||(n>TURTLEMAXN)||(key == NULL)||(shortkey == NULL)) return -1;
  74.     nn=n*n;
  75.     /* first create a hare key from the shortkey */
  76.     hare_key(shortkey,len,&harekey);
  77.     /* use hare to permute the real sboxes */
  78.     for (j=0; j<nn; j++) {
  79.         for (i=0; i<NTURTLEWORDS; i++) {
  80.             key->sbox[j][i] = i;
  81.         }
  82.         for (i=0; i<NTURTLEWORDS; i++) {
  83.             other = hare_stream(&harekey);
  84.             t = key->sbox[j][i];
  85.             key->sbox[j][i] = key->sbox[j][other];
  86.             key->sbox[j][other] = t;
  87.         }
  88.     }
  89.     key->n=n;
  90.     key->rr[3] = nn/4*3;
  91.     key->rr[2] = nn/4*2;
  92.     key->rr[1] = nn/4;
  93.     key->rr[0] = 0;
  94.     return 0;
  95. }
  96. /*
  97.  * Basic hare stream generator
  98.  * (returns one TURTLEWORD)
  99.  */
  100. TURTLEWORD hare_stream(HK *key) {
  101.     TURTLEWORD r, l, t;
  102.     int table, otable;
  103.     r = key->r;
  104.     l = key->l;
  105.     table = key->table;
  106.     otable = 1-table;
  107.     r^=key->sbox[table][0][l];
  108.     l^=key->sbox[table][1][r];
  109.     r^=key->sbox[table][2][l];
  110.     l^=key->sbox[table][3][r];
  111.     t = key->sbox[otable][key->r][key->l];
  112.     key->sbox[otable][key->r][key->l] = key->sbox[otable][key->r][r];
  113.     key->sbox[otable][key->r][r] = t;
  114.     key->l = (key->l + 1) % NTURTLEWORDS;
  115.     if (key->l == 0) {
  116.         key->r = (key->r + 1) % NTURTLEWORDS;
  117.     }
  118.     if (key->r > 3) {
  119.         key->r = 0;
  120.         key->l = 0;
  121.         key->table = otable;
  122.     }
  123.     return l;
  124. }
  125. /*
  126.  * create hare key from short key
  127.  */
  128. int hare_key(TURTLEWORD *shortkey, int len, HK *key) {
  129.     if ((key == NULL)||(shortkey == NULL)) return -1;
  130.     /* first create the tables from the shortkey */
  131.     keyperm(key->sbox[0],shortkey,len,4);
  132.     /* do it again for the other set */
  133.     keyperm(key->sbox[1],shortkey,len,4);
  134.     key->table = 0;
  135.     key->r = 0;
  136.     key->l = 0;
  137.     return 0;
  138. }
  139. /*********************************************
  140. * support functions - not part of interface *
  141. *********************************************/
  142. /*
  143.  * recursive turtle function
  144.  */
  145. static int r_turtle_encrypt(TURTLEWORD *in, TURTLEWORD *out, int n, TK *key) {
  146.     int nn, i;
  147.     TURTLEWORD buf[TURTLEMAXN];
  148.     if (n==2) { /* this is the basic lookup */
  149.         out[1] = in[1] ^ key->sbox[r++][in[0]];
  150.         out[0] = in[0] ^ key->sbox[r++][out[1]];
  151.         out[1] ^= key->sbox[r++][out[0]];
  152.         out[0] ^= key->sbox[r++][out[1]];
  153.     } else { /* recurse */
  154.         nn=n/2;
  155.         r_turtle_encrypt(&(in[0]),buf,nn,key);
  156.         for (i=0; i<nn; i++) out[i+nn] = in[i+nn] ^ buf[i];
  157.         r_turtle_encrypt(&(out[nn]),buf,nn,key);
  158.         for (i=0; i<nn; i++) out[i] = in[i] ^ buf[i];
  159.         r_turtle_encrypt(&(out[0]),buf,nn,key);
  160.         for (i=0; i<nn; i++) out[i+nn] ^= buf[i];
  161.         r_turtle_encrypt(&(out[nn]),buf,nn,key);
  162.         for (i=0; i<nn; i++) out[i] ^= buf[i];
  163.     }
  164.     return 0;
  165. }
  166. /* Simple key permutation expand function.
  167.  * This is really more of an example than anything else.
  168.  * Generate n permutations on 2^WORDBITS elements from the cryptovariable.
  169.  * This is approximately similar to the RC-4 permutation generator, but
  170.  * we go through each table WORDBITS times, which smoothes out the early
  171.  * swaps and does a total of x log x swaps in each permutation.
  172.  */
  173. static void keyperm(TURTLEWORD sbox[][NTURTLEWORDS], TURTLEWORD *key, int len, int n) {
  174.     int a, b, i, j, k;
  175.     TURTLEWORD t;
  176.     for (b=0; b<n; b++) {
  177.         for (i=0; i<NTURTLEWORDS; i++) {
  178.             sbox[b][i]=i;
  179.         }
  180.     }
  181.     j=len;
  182.     k=0;
  183.     for (b=0; b<n; b++) { /* for each keygen sbox */
  184.         for (a=0; a<TURTLEBITS; a++) { /* n times around for each */
  185.             for (i=0; i<NTURTLEWORDS; i++) { /* swap w/ element */
  186.                 j = (j + key[k] + sbox[b][(a*b+i)%NTURTLEWORDS]) %NTURTLEWORDS;
  187.                 t = sbox[b][i];
  188.                 sbox[b][i] = sbox[b][j];
  189.                 sbox[b][j] = t;
  190.                 k=(k+1)%len;
  191.             }
  192.         }
  193.     }
  194. }