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

外挂编程

开发平台:

Windows_Unix

  1. /*
  2.  * FEAL8 - Implementation of NTT's FEAL-8 cipher.
  3.  * Version of 11 September 1989.
  4.  */
  5. #include "feal8.h"
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. typedef unsigned long HalfWord;
  10. typedef unsigned int QuarterWord;
  11. static QuarterWord K[16];
  12. static HalfWord K89, K1011, K1213, K1415;
  13. static void DissH1( HalfWord H, unsigned char *D );
  14. static HalfWord f( HalfWord AA, QuarterWord BB );
  15. static HalfWord MakeH1(unsigned char *B);
  16. static HalfWord FK( HalfWord AA, HalfWord BB );
  17. static void DissQ1( QuarterWord Q, unsigned char *B );
  18. static unsigned char S0(unsigned char X1, unsigned char X2);
  19. static unsigned char S1(unsigned char X1, unsigned char X2);
  20. /*
  21.  * Decrypt a block, using the last key set.
  22.  */
  23. void F8_Decrypt(unsigned char *Cipher, unsigned char *Plain)
  24. {
  25.     HalfWord L, R, NewL ;
  26.     int r ;
  27.     R = MakeH1( Cipher ) ;
  28.     L = MakeH1( Cipher+4 ) ;
  29.     R ^= K1213 ;
  30.     L ^= K1415 ;
  31.     L ^= R ;
  32.     for ( r = 7 ; r >= 0 ; --r )
  33.     {
  34.      NewL = R ^ f( L, K[r] ) ;
  35.      R = L ;
  36.      L = NewL ;
  37.     }
  38.     R ^= L ;
  39.     R ^= K1011 ;
  40.     L ^= K89 ;
  41.     DissH1( L, Plain ) ;
  42.     DissH1( R, Plain + 4 ) ;
  43. }
  44. /*
  45.  * Disassemble the given halfword into 4 bytes.
  46.  */
  47. static void DissH1( HalfWord H, unsigned char *D )
  48. {
  49.     union {
  50.      HalfWord All ;
  51.      unsigned char Byte[4] ;
  52.     } T ;
  53.     T.All = H ;
  54.     *D++ = T.Byte[0] ;
  55.     *D++ = T.Byte[1] ;
  56.     *D++ = T.Byte[2] ;
  57.     *D   = T.Byte[3] ;
  58. }
  59. /*
  60.  * Disassemble a quarterword into two Bytes.
  61.  */
  62. static void DissQ1( QuarterWord Q, unsigned char *B )
  63. {
  64.     union {
  65.      QuarterWord All ;
  66.      unsigned char Byte[2] ;
  67.     } QQ ;
  68.     QQ.All = Q ;
  69.     *B++ = QQ.Byte[0] ;
  70.     *B   = QQ.Byte[1] ;
  71. }
  72. /*
  73.  * Encrypt a block, using the last key set.
  74.  */
  75. void F8_Encrypt( unsigned char *Plain, unsigned char *Cipher )
  76. {
  77.     HalfWord L, R, NewR ;
  78.     int r ;
  79.     HalfWord MakeH1( unsigned char * ) ;
  80.     HalfWord f( HalfWord, QuarterWord ) ;
  81.     void DissH1( HalfWord, unsigned char * ) ;
  82.     L = MakeH1( Plain ) ;
  83.     R = MakeH1( Plain+4 ) ;
  84.     L ^= K89 ;
  85.     R ^= K1011 ;
  86.     R ^= L ;
  87.     for ( r = 0 ; r < 8 ; ++r )
  88.     {
  89.      NewR = L ^ f( R, K[r] ) ;
  90.      L = R ;
  91.      R = NewR ;
  92.     }
  93.     L ^= R ;
  94.     R ^= K1213 ;
  95.     L ^= K1415 ;
  96.     DissH1( R, Cipher ) ;
  97.     DissH1( L, Cipher + 4 ) ;
  98. }
  99. /*
  100.  * Evaluate the f function.
  101.  */
  102. static HalfWord f( HalfWord AA, QuarterWord BB )
  103. {
  104.     unsigned char f1, f2 ;
  105.     union {
  106.      unsigned long All ;
  107.      unsigned char Byte[4] ;
  108.     } RetVal, A ;
  109.     union {
  110.      unsigned int All ;
  111.      unsigned char Byte[2] ;
  112.     } B ;
  113.     A.All = AA ;
  114.     B.All = BB ;
  115.     f1 = A.Byte[1] ^ B.Byte[0] ^ A.Byte[0] ;
  116.     f2 = A.Byte[2] ^ B.Byte[1] ^ A.Byte[3] ;
  117.     f1 = S1( f1, f2 ) ;
  118.     f2 = S0( f2, f1 ) ;
  119.     RetVal.Byte[1] = f1 ;
  120.     RetVal.Byte[2] = f2 ;
  121.     RetVal.Byte[0] = S0( A.Byte[0], f1 ) ;
  122.     RetVal.Byte[3] = S1( A.Byte[3], f2 ) ;
  123.     return RetVal.All ;
  124. }
  125. /*
  126.  * Evaluate the FK function.
  127.  */
  128. static HalfWord FK( HalfWord AA, HalfWord BB )
  129. {
  130.     unsigned char FK1, FK2 ;
  131.     union {
  132.      unsigned long All ;
  133.      unsigned char Byte[4] ;
  134.     } RetVal, A, B ;
  135.     A.All = AA ;
  136.     B.All = BB ;
  137.     FK1 = A.Byte[1] ^ A.Byte[0] ;
  138.     FK2 = A.Byte[2] ^ A.Byte[3] ;
  139.     FK1 = S1( FK1, FK2 ^ B.Byte[0] ) ;
  140.     FK2 = S0( FK2, FK1 ^ B.Byte[1] ) ;
  141.     RetVal.Byte[1] = FK1 ;
  142.     RetVal.Byte[2] = FK2 ;
  143.     RetVal.Byte[0] = S0( A.Byte[0], FK1 ^ B.Byte[2] ) ;
  144.     RetVal.Byte[3] = S1( A.Byte[3], FK2 ^ B.Byte[3] ) ;
  145.     return RetVal.All ;
  146. }
  147. /*
  148.  * Assemble a HalfWord from the four bytes provided.
  149.  */
  150. static HalfWord MakeH1( unsigned char *B )
  151. {
  152.     union {
  153.      unsigned long All ;
  154.      unsigned char Byte[4] ;
  155.     } RetVal ;
  156.     RetVal.Byte[0] = *B++ ;
  157.     RetVal.Byte[1] = *B++ ;
  158.     RetVal.Byte[2] = *B++ ;
  159.     RetVal.Byte[3] = *B ;
  160.     return RetVal.All ;
  161. }
  162. /*
  163.  * Make a halfword from the two quarterwords given.
  164.  */
  165. static HalfWord MakeH2( QuarterWord *Q )
  166. {
  167.     unsigned char B[4] ;
  168.     DissQ1( *Q++, B ) ;
  169.     DissQ1( *Q, B+2 ) ;
  170.     return MakeH1( B ) ;
  171. }
  172. /*
  173.  * Evaluate the Rot2 function.
  174.  */
  175. static unsigned char Rot2( unsigned char X )
  176. {
  177.     static int First = 1 ;
  178.     static unsigned char RetVal[ 256 ] ;
  179.     if ( First )
  180.     {
  181.      int i, High, Low ;
  182.      for ( i = 0, High = 0, Low = 0 ; i < 256 ; ++i )
  183.      {
  184.  RetVal[ i ] = High + Low ;
  185.  High += 4 ;
  186.  if ( High > 255 )
  187.  {
  188.   High = 0 ;
  189.   ++Low ;
  190.  }
  191.      }
  192.      First = 0 ;
  193.     }
  194.     return RetVal[ X ] ;
  195. }
  196. static unsigned char S0( unsigned char X1, unsigned char X2 )
  197. {
  198.     return Rot2( ( X1 + X2 ) & 0xff ) ;
  199. }
  200. static unsigned char S1( unsigned char X1, unsigned char X2 )
  201. {
  202.     return Rot2( ( X1 + X2 + 1 ) & 0xff ) ;
  203. }
  204. /*
  205.  * KP points to an array of 8 bytes.
  206.  */
  207. void F8_SetKey( unsigned char *KP )
  208. {
  209.     union {
  210.      HalfWord All ;
  211.      unsigned char Byte[4] ;
  212.     } A, B, D, NewB ;
  213.     union {
  214.      QuarterWord All ;
  215.      unsigned char Byte[2] ;
  216.     } Q ;
  217.     int i ;
  218.     QuarterWord *Out ;
  219.     A.Byte[0] = *KP++ ;
  220.     A.Byte[1] = *KP++ ;
  221.     A.Byte[2] = *KP++ ;
  222.     A.Byte[3] = *KP++ ;
  223.     B.Byte[0] = *KP++ ;
  224.     B.Byte[1] = *KP++ ;
  225.     B.Byte[2] = *KP++ ;
  226.     B.Byte[3] = *KP ;
  227.     D.All = 0 ;
  228.     for ( i = 1, Out = K ; i <= 8 ; ++i )
  229.     {
  230.      NewB.All = FK( A.All, B.All ^ D.All ) ;
  231.      D = A ;
  232.      A = B ;
  233.      B = NewB ;
  234.      Q.Byte[0] = B.Byte[0] ;
  235.      Q.Byte[1] = B.Byte[1] ;
  236.      *Out++ = Q.All ;
  237.      Q.Byte[0] = B.Byte[2] ;
  238.      Q.Byte[1] = B.Byte[3] ;
  239.      *Out++ = Q.All ;
  240.     }
  241.     K89 = MakeH2( K+8 ) ;
  242.     K1011 = MakeH2( K+10 ) ;
  243.     K1213 = MakeH2( K+12 ) ;
  244.     K1415 = MakeH2( K+14 ) ;
  245. }
  246. #ifdef __cplusplus
  247. }
  248. #endif