des.h
上传用户:zhh515
上传日期:2007-01-06
资源大小:966k
文件大小:5k
源码类别:

加密解密

开发平台:

C/C++

  1. //  IBM PC Implementation of the DES Cryptographic Algorithm by
  2. //  Dr B. R. Gladman (gladman@seven77.demon.co.uk)
  3. //
  4. //  Some of the techniques in this DES source code are derived 
  5. //  from ideas developed by Richard Outerbridge and Eric Young.  
  6. //  I gratefully acknowledge their contribution.
  7. //
  8. //  Note on Bit Numbering.  The DES bit numbering is the reverse of that
  9. //  used on the intel series processors.  Thus to translate between bits
  10. //  and numeric values requires a reversal of bit sequences.  To achieve
  11. //  this for external numbers the initial and final DES permutations and
  12. //  the initial key permutation are adjusted to take care of the changed
  13. //  bit order.  The other changes required are in the calculation of the
  14. //  s_box inputs and outputs. The bits numbering reversal on s_box input
  15. //  is obtained by reordering the s_box tables.  The bit reversal within
  16. //  output nibbles is done by reordering the exit permutation.
  17. #ifndef byte
  18. #  define byte(x,n)   ((unsigned char)((x) >> (8 * (n))))
  19. #endif
  20. #ifndef _MSC_VER
  21. #define rotr(x,n)   (((x) >> ((int)(n))) | ((x) << (32 - (int)(n))))
  22. #define rotl(x,n)   (((x) << ((int)(n))) | ((x) >> (32 - (int)(n))))
  23. #else
  24. #include <stdlib.h>
  25. #pragma intrinsic(_lrotr,_lrotl)
  26. #define rotr(x,n)   _lrotr(x,n)
  27. #define rotl(x,n)   _lrotl(x,n)
  28. #endif
  29. #define bit_swap(a,b,n,m)       
  30.     tt = ((a >> n) ^ b) & m;    
  31.     b ^= tt; a ^= (tt << n)
  32. #define ip_old(x,y)                     
  33.     bit_swap((x),(y),  4, 0x0f0f0f0fL); 
  34.     bit_swap((y),(x), 16, 0x0000ffffL); 
  35.     bit_swap((x),(y),  2, 0x33333333L); 
  36.     bit_swap((y),(x),  8, 0x00ff00ffL); 
  37.     bit_swap((x),(y),  1, 0x55555555L); 
  38.     (x) = rotl((x), 1);                 
  39.     (y) = rotl((y), 1)
  40. #define fp_old(x,y)                     
  41.     (y) = rotr((y), 1);                 
  42.     (x) = rotr((x), 1);                 
  43.     bit_swap((x),(y),  1, 0x55555555L); 
  44.     bit_swap((y),(x),  8, 0x00ff00ffL); 
  45.     bit_swap((x),(y),  2, 0x33333333L); 
  46.     bit_swap((y),(x), 16, 0x0000ffffL); 
  47.     bit_swap((x),(y),  4, 0x0f0f0f0fL)
  48. #define ip(x,y)                     
  49.     (x) = rotr((x), 4);             
  50.     tt = ((x) ^ (y)) & 0x0f0f0f0fL; 
  51.     (y) ^= tt;                      
  52.     (x) = rotr((x) ^ tt, 12);       
  53.     tt = ((y) ^ (x)) & 0xffff0000L; 
  54.     (y) ^= tt;                      
  55.     (x) = rotr((x) ^ tt, 18);       
  56.     tt = ((x) ^ (y)) & 0x33333333L; 
  57.     (y) ^= tt;                      
  58.     (x) = rotr((x) ^ tt, 22);       
  59.     tt = ((y) ^ (x)) & 0xff00ff00L; 
  60.     (y) ^= tt;                      
  61.     (x) = rotr((x) ^ tt,  9);       
  62.     tt = ((x) ^ (y)) & 0x55555555L; 
  63.     (x) = rotl((x) ^ tt, 2);        
  64.     (y) = rotl((y) ^ tt, 1)
  65. #define fp(x,y)                     
  66.     (y) = rotr((y), 1);             
  67.     (x) = rotr((x), 2);             
  68.     tt = ((x) ^ (y)) & 0x55555555L; 
  69.     (y) ^= tt;                      
  70.     (x) = rotl((x) ^ tt,  9);       
  71.     tt = ((y) ^ (x)) & 0xff00ff00L; 
  72.     (y) ^= tt;                      
  73.     (x) = rotl((x) ^ tt, 22);       
  74.     tt = ((x) ^ (y)) & 0x33333333L; 
  75.     (y) ^= tt;                      
  76.     (x) = rotl((x) ^ tt, 18);       
  77.     tt = ((y) ^ (x)) & 0xffff0000L; 
  78.     (y) ^= tt;                      
  79.     (x) = rotl((x) ^ tt, 12);       
  80.     tt = ((x) ^ (y)) & 0x0f0f0f0fL; 
  81.     (y) ^= tt;                      
  82.     (x) = rotl((x) ^ tt, 4)
  83. #ifdef  BIG_TABLES
  84. #define round(x0,x1,ki)                                        
  85.     l1  = (rotr(x1, 4) ^ *(((unsigned long*)key) + ki + 1));   
  86.     l0  = (x1 ^ *(((unsigned long*)key) + ki));                
  87.     x0 ^= sx_tab[0][byte(l0,0)] | sx_tab[1][byte(l1,0)]        
  88.         | sx_tab[2][byte(l0,1)] | sx_tab[3][byte(l1,1)]        
  89.         | sx_tab[4][byte(l0,2)] | sx_tab[5][byte(l1,2)]        
  90.         | sx_tab[6][byte(l0,3)] | sx_tab[7][byte(l1,3)]
  91. #else
  92. #define round(x0,x1,ki)                                                     
  93.     l1  = (rotr(x1, 4) ^ *(((unsigned long*)key) + ki + 1)) & 0x3f3f3f3f;   
  94.     l0  = (x1 ^ *(((unsigned long*)key) + ki)) & 0x3f3f3f3f;                
  95.     x0 ^= sx_tab[0][byte(l0,0)] | sx_tab[1][byte(l1,0)]                     
  96.         | sx_tab[2][byte(l0,1)] | sx_tab[3][byte(l1,1)]                     
  97.         | sx_tab[4][byte(l0,2)] | sx_tab[5][byte(l1,2)]                     
  98.         | sx_tab[6][byte(l0,3)] | sx_tab[7][byte(l1,3)]
  99. #endif
  100. #ifdef  __cplusplus
  101. extern "C"
  102. {
  103.     void des_ky(void *kval, void *key);
  104.     void des_ec(const void *i_blk, void *o_blk, void *key);
  105.     void des_dc(const void *i_blk, void *o_blk, void *key);
  106. };
  107. #else
  108. void des_ky(void *kval, void *key);
  109. void des_ec(const void *i_blk, void *o_blk, void *key);
  110. void des_dc(const void *i_blk, void *o_blk, void *key);
  111. #endif