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

外挂编程

开发平台:

Windows_Unix

  1. /*******************************************************************************
  2. *
  3. * FILE:           safer.c
  4. *
  5. * DESCRIPTION:    block-cipher algorithm SAFER (Secure And Fast Encryption
  6. *                 Routine) in its four versions: SAFER K-64, SAFER K-128,
  7. *                 SAFER SK-64 and SAFER SK-128.
  8. *
  9. * AUTHOR:         Richard De Moliner (demoliner@isi.ee.ethz.ch)
  10. *                 Signal and Information Processing Laboratory
  11. *                 Swiss Federal Institute of Technology
  12. *                 CH-8092 Zuerich, Switzerland
  13. *
  14. * DATE:           September 9, 1995
  15. *
  16. * CHANGE HISTORY:
  17. *
  18. *******************************************************************************/
  19. /******************* External Headers *****************************************/
  20. /******************* Local Headers ********************************************/
  21. #include "safer.h"
  22. /******************* Constants ************************************************/
  23. #define TAB_LEN      256
  24. /******************* Assertions ***********************************************/
  25. /******************* Macros ***************************************************/
  26. #define ROL(x, n)    ((unsigned char)(((unsigned int)(x) << (n))
  27.  |((unsigned int)((x) & 0xFF) >> (8 - (n)))))
  28. #define EXP(x)       exp_tab[(x) & 0xFF]
  29. #define LOG(x)       log_tab[(x) & 0xFF]
  30. #define PHT(x, y)    { y += x; x += y; }
  31. #define IPHT(x, y)   { x -= y; y -= x; }
  32. /******************* Types ****************************************************/
  33. static unsigned char exp_tab[TAB_LEN];
  34. static unsigned char log_tab[TAB_LEN];
  35. /******************* Module Data **********************************************/
  36. static int init_called = 0;
  37. /******************* Functions ************************************************/
  38. /******************************************************************************/
  39. #ifndef NOT_ANSI_C
  40.     void Safer_Init_Module(void)
  41. #else
  42.     Safer_Init_Module()
  43. #endif
  44. {   unsigned int i, exp;
  45. if (init_called) return;
  46. exp = 1;
  47.     for (i = 0; i < TAB_LEN; i++)
  48.     {
  49.         exp_tab[i] = (unsigned char)(exp & 0xFF);
  50.         log_tab[exp_tab[i]] = (unsigned char)i;
  51.         exp = exp * 45 % 257;
  52. }
  53. init_called = 1;
  54. } /* Safer_Init_Module */
  55. /******************************************************************************/
  56. #ifndef NOT_ANSI_C
  57.     void Safer_Expand_Userkey(safer_block_t userkey_1,
  58.                               safer_block_t userkey_2,
  59.                               unsigned int nof_rounds,
  60.                               int strengthened,
  61.                               safer_key_t key)
  62. #else
  63.     Safer_Expand_Userkey(userkey_1, userkey_2, nof_rounds, strengthened, key)
  64.     safer_block_t userkey_1;
  65.     safer_block_t userkey_2;
  66.     unsigned int nof_rounds;
  67.     int strengthened;
  68.     safer_key_t key;
  69. #endif
  70. {   unsigned int i, j;
  71.     unsigned char ka[SAFER_BLOCK_LEN + 1];
  72.     unsigned char kb[SAFER_BLOCK_LEN + 1];
  73.     if (SAFER_MAX_NOF_ROUNDS < nof_rounds)
  74.         nof_rounds = SAFER_MAX_NOF_ROUNDS;
  75.     *key++ = (unsigned char)nof_rounds;
  76.     ka[SAFER_BLOCK_LEN] = 0;
  77.     kb[SAFER_BLOCK_LEN] = 0;
  78.     for (j = 0; j < SAFER_BLOCK_LEN; j++)
  79.     {
  80.         ka[SAFER_BLOCK_LEN] ^= ka[j] = ROL(userkey_1[j], 5);
  81.         kb[SAFER_BLOCK_LEN] ^= kb[j] = *key++ = userkey_2[j];
  82.     }
  83.     for (i = 1; i <= nof_rounds; i++)
  84.     {
  85.         for (j = 0; j < SAFER_BLOCK_LEN + 1; j++)
  86.         {
  87.             ka[j] = ROL(ka[j], 6);
  88.             kb[j] = ROL(kb[j], 6);
  89.         }
  90.         for (j = 0; j < SAFER_BLOCK_LEN; j++)
  91.             if (strengthened)
  92.                 *key++ = (ka[(j + 2 * i - 1) % (SAFER_BLOCK_LEN + 1)]
  93.                                 + exp_tab[exp_tab[18 * i + j + 1]]) & 0xFF;
  94.             else
  95.                 *key++ = (ka[j] + exp_tab[exp_tab[18 * i + j + 1]]) & 0xFF;
  96.         for (j = 0; j < SAFER_BLOCK_LEN; j++)
  97.             if (strengthened)
  98.                 *key++ = (kb[(j + 2 * i) % (SAFER_BLOCK_LEN + 1)]
  99.                                 + exp_tab[exp_tab[18 * i + j + 10]]) & 0xFF;
  100.             else
  101.                 *key++ = (kb[j] + exp_tab[exp_tab[18 * i + j + 10]]) & 0xFF;
  102.     }
  103.     for (j = 0; j < SAFER_BLOCK_LEN + 1; j++)
  104.         ka[j] = kb[j] = 0;
  105. } /* Safer_Expand_Userkey */
  106. /******************************************************************************/
  107. #ifndef NOT_ANSI_C
  108.     void Safer_Encrypt_Block(safer_block_t block_in, safer_key_t key,
  109.                              safer_block_t block_out)
  110. #else
  111.     Safer_Encrypt_Block(block_in, key, block_out)
  112.     safer_block_t block_in;
  113.     safer_key_t key;
  114.     safer_block_t block_out;
  115. #endif
  116. {   unsigned char a, b, c, d, e, f, g, h, t;
  117.     unsigned int round;
  118.     a = block_in[0]; b = block_in[1]; c = block_in[2]; d = block_in[3];
  119.     e = block_in[4]; f = block_in[5]; g = block_in[6]; h = block_in[7];
  120.     if (SAFER_MAX_NOF_ROUNDS < (round = *key)) round = SAFER_MAX_NOF_ROUNDS;
  121.     while(round--)
  122.     {
  123.         a ^= *++key; b += *++key; c += *++key; d ^= *++key;
  124.         e ^= *++key; f += *++key; g += *++key; h ^= *++key;
  125.         a = EXP(a) + *++key; b = LOG(b) ^ *++key;
  126.         c = LOG(c) ^ *++key; d = EXP(d) + *++key;
  127.         e = EXP(e) + *++key; f = LOG(f) ^ *++key;
  128.         g = LOG(g) ^ *++key; h = EXP(h) + *++key;
  129.         PHT(a, b); PHT(c, d); PHT(e, f); PHT(g, h);
  130.         PHT(a, c); PHT(e, g); PHT(b, d); PHT(f, h);
  131.         PHT(a, e); PHT(b, f); PHT(c, g); PHT(d, h);
  132.         t = b; b = e; e = c; c = t; t = d; d = f; f = g; g = t;
  133.     }
  134.     a ^= *++key; b += *++key; c += *++key; d ^= *++key;
  135.     e ^= *++key; f += *++key; g += *++key; h ^= *++key;
  136.     block_out[0] = a & 0xFF; block_out[1] = b & 0xFF;
  137.     block_out[2] = c & 0xFF; block_out[3] = d & 0xFF;
  138.     block_out[4] = e & 0xFF; block_out[5] = f & 0xFF;
  139.     block_out[6] = g & 0xFF; block_out[7] = h & 0xFF;
  140. } /* Safer_Encrypt_Block */
  141. /******************************************************************************/
  142. #ifndef NOT_ANSI_C
  143.     void Safer_Decrypt_Block(safer_block_t block_in, safer_key_t key, 
  144.                              safer_block_t block_out)
  145. #else
  146.     Safer_Decrypt_Block(block_in, key, block_out)
  147.     safer_block_t block_in;
  148.     safer_key_t key;
  149.     safer_block_t block_out;
  150. #endif
  151. {   unsigned char a, b, c, d, e, f, g, h, t;
  152.     unsigned int round;
  153.     a = block_in[0]; b = block_in[1]; c = block_in[2]; d = block_in[3];
  154.     e = block_in[4]; f = block_in[5]; g = block_in[6]; h = block_in[7];
  155.     if (SAFER_MAX_NOF_ROUNDS < (round = *key)) round = SAFER_MAX_NOF_ROUNDS;
  156.     key += SAFER_BLOCK_LEN * (1 + 2 * round);
  157.     h ^= *key; g -= *--key; f -= *--key; e ^= *--key;
  158.     d ^= *--key; c -= *--key; b -= *--key; a ^= *--key;
  159.     while (round--)
  160.     {
  161.         t = e; e = b; b = c; c = t; t = f; f = d; d = g; g = t;
  162.         IPHT(a, e); IPHT(b, f); IPHT(c, g); IPHT(d, h);
  163.         IPHT(a, c); IPHT(e, g); IPHT(b, d); IPHT(f, h);
  164.         IPHT(a, b); IPHT(c, d); IPHT(e, f); IPHT(g, h);
  165.         h -= *--key; g ^= *--key; f ^= *--key; e -= *--key;
  166.         d -= *--key; c ^= *--key; b ^= *--key; a -= *--key;
  167.         h = LOG(h) ^ *--key; g = EXP(g) - *--key;
  168.         f = EXP(f) - *--key; e = LOG(e) ^ *--key;
  169.         d = LOG(d) ^ *--key; c = EXP(c) - *--key;
  170.         b = EXP(b) - *--key; a = LOG(a) ^ *--key;
  171.     }
  172.     block_out[0] = a & 0xFF; block_out[1] = b & 0xFF;
  173.     block_out[2] = c & 0xFF; block_out[3] = d & 0xFF;
  174.     block_out[4] = e & 0xFF; block_out[5] = f & 0xFF;
  175.     block_out[6] = g & 0xFF; block_out[7] = h & 0xFF;
  176. } /* Safer_Decrypt_Block */
  177. /******************************************************************************/