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

加密解密

开发平台:

C/C++

  1. From: rscott@falcon.ic.net (Robert Scott)
  2. Newsgroups: sci.crypt
  3. Subject: Revision of NEWDES
  4. Date: 2 Mar 1996 21:47:53 GMT
  5. Organization: ICNet ... Your Link to the Internet ... 313-998-0090
  6. Lines: 164
  7. Message-ID: <4hafm9$r51@condor.ic.net>
  8. NNTP-Posting-Host: falcon.ic.net
  9. X-Newsreader: TIN [version 1.2 PL2]
  10.                          Revision of NEWDES
  11.                               -by Robert Scott 
  12. When I designed NEWDES in 1984-1985, I had a very simple key 
  13. expansion.  I expanded 15 bytes of key into 60 bytes by repeating 
  14. the 15 bytes four times.  It now appears that such a simple key 
  15. expansion creates a vulnerability to a related-key attack.  In a 
  16. related-key attack the attacker uses the fact that if the key is 
  17. changed to a related key, there is some information he has about the 
  18. resulting ciphertext without actually running the entire encryption 
  19. algorithm.  In the case of NEWDES, this information comes from the 
  20. fact that if the 15-byte key is rotated seven bytes, the expanded 
  21. 60-byte key is also rotated seven bytes, which is exactly two
  22. round's worth of key.  Therefore the encryption algorithm using the 
  23. rotated key does 17 rounds where the last 15 rounds are the same as 
  24. the first 15 rounds using the un-rotated key.
  25. I therefore would like to revise my NEWDES algorithm to add a good 
  26. key expansion algorithm.  This will be done in keeping with the 
  27. original design goals, which were: 
  28.    1. open design - no hidden structure
  29.    2. simple and fast software implementation
  30.    3. functional replacement for DES with more security
  31. My first inclination was to simply re-order the 15 key bytes as they 
  32. are used in the expansion.  This would break the pattern of having a 
  33. rotation of seven bytes causing the same key bytes to appear in 
  34. similar positions in the encryption.  Such an expansion would not 
  35. incur any additional delay in a hardware implementation since only 
  36. the ordering of the expanded key bytes would be changed.  However, 
  37. upon more reflection, the risk of making such a minimal change was 
  38. too great.  There may be more complex related key attacks.  
  39. My next thought was to ensure that all 60 bytes of expanded key are 
  40. potentially different.  A simple way to do this is to form each of 
  41. the 60 bytes of expanded key as the exclusive-or of an original key 
  42. byte and one of four other bytes.  For these other four bytes I 
  43. have chosen 0 and three of the 15 key bytes.  Specifically, if 
  44. K0...K14 are the 15 key bytes, then the 60 expanded key bytes would 
  45. be 
  46.   K0       K1       K2       . . . . K13       K14   
  47.   K0^K7    K1^K7    K2^K7    . . . . K13^K7    K14^K7 
  48.   K0^K8    K1^K8    K2^K8    . . . . K13^K8    K14^K8 
  49.   K0^K9    K1^K9    K2^K9    . . . . K13^K9    K14^K9 
  50. where '^' denotes exclusive-or.  I am aware of the fact that there 
  51. are three zeros in this list of 60 bytes.  However, this does not 
  52. weaken the algorithm.  The zeroes occur in single instances of what 
  53. used to be K7, K8, and K9.  However, these key bytes appear more 
  54. than any others in the total list, so they can afford to miss one 
  55. showing apiece.
  56. The following C-code can be used to implement this revised version 
  57. of NEWDES.  By the way, the algorithm uses a permutation on bytes 
  58. called the f-function.  This function is given in tabular form 
  59. within the following C-code.  But if anyone would like to verify or 
  60. generate the randomizing permutation, f, as described in the 
  61. original Cryptologia article, please e-mail me and I will e-mail you 
  62. the C-code to generate the f-function, together with my 
  63. transcription of the Declaration of Independence on which the f-
  64. function is based. 
  65. /* newdes.c  -  Revised 3-2-96 to include better key expansion */
  66. /*           -  Released to the public domain by Robert Scott  */
  67. /*           -  Originally published in Cryptologia, Jan. 1985 */
  68. static char f[256] = {
  69.  32,137,239,188,102,125,221,72,212,68,81,37,86,237,147,149,
  70.  70,229,17,124,115,207,33,20,122,143,25,215,51,183,138,142,
  71.  146,211,110,173,1,228,189,14,103,78,162,36,253,167,116,255,
  72.  158,45,185,50,98,168,250,235,54,141,195,247,240,63,148,2,
  73.  224,169,214,180,62,22,117,108,19,172,161,159,160,47,43,171,
  74.  194,175,178,56,196,112,23,220,89,21,164,130,157,8,85,251,
  75.  216,44,94,179,226,38,90,119,40,202,34,206,35,69,231,246,
  76.  29,109,74,71,176,6,60,145,65,13,77,151,12,127,95,199,
  77.  57,101,5,232,150,210,129,24,181,10,121,187,48,193,139,252,
  78.  219,64,88,233,96,128,80,53,191,144,218,11,106,132,155,104,
  79.  91,136,31,42,243,66,126,135,30,26,87,186,182,154,242,123,
  80.  82,166,208,39,152,190,113,205,114,105,225,84,73,163,99,111,
  81.  204,61,200,217,170,15,198,28,192,254,134,234,222,7,236,248,
  82.  201,41,177,156,92,131,67,249,245,184,203,9,241,0,27,46,
  83.  133,174,75,18,93,209,100,120,76,213,16,83,4,107,140,52,
  84.  58,55,3,244,97,197,238,227,118,49,79,230,223,165,153,59};
  85. char B0,B1,B2,B3,B4,B5,B6,B7;
  86. char Key[15];
  87. /* The following code acts on the block B0...B7
  88.    using Key[0]...Key[14] */
  89. encrypt()
  90. {
  91.         int i;
  92.         char ex;
  93.     ex = 0;
  94.     i = 0;
  95.     while(1)
  96.     {
  97.         B4 = B4 ^ f[B0 ^ Key[i] ^ ex];
  98.         if(++i==15) {i = 0;  ex = Key[7];}
  99.         B5 = B5 ^ f[B1 ^ Key[i] ^ ex];
  100.         if(++i==15) {i = 0;  ex = Key[8];}
  101.         B6 = B6 ^ f[B2 ^ Key[i] ^ ex];
  102.         if(++i==15) {i = 0;  ex = Key[9];}
  103.         B7 = B7 ^ f[B3 ^ Key[i] ^ ex];
  104.         if(++i==15) return;
  105.         B1 = B1 ^ f[B4 ^ Key[i++] ^ ex];
  106.         B2 = B2 ^ f[B4 ^ B5];
  107.         B3 = B3 ^ f[B6 ^ Key[i++] ^ ex];
  108.         B0 = B0 ^ f[B7 ^ Key[i++] ^ ex];
  109.       }
  110. }
  111. decrypt()
  112. {
  113.         int i;
  114.         char ex;
  115.     ex = Key[9];
  116.     i = 14;
  117.     while(1)
  118.     {
  119.         B7 = B7 ^ f[B3 ^ Key[i] ^ ex];
  120.         if(--i<0) {i = 14;  ex = Key[8];}
  121.         B6 = B6 ^ f[B2 ^ Key[i] ^ ex];
  122.         if(--i<0) {i = 14;  ex = Key[7];}
  123.         B5 = B5 ^ f[B1 ^ Key[i] ^ ex];
  124.         if(--i<0) {i = 14;  ex = 0;}
  125.         B4 = B4 ^ f[B0 ^ Key[i] ^ ex];
  126.         if(--i<0) return;
  127.         B0 = B0 ^ f[B7 ^ Key[i--] ^ ex];
  128.         B3 = B3 ^ f[B6 ^ Key[i--] ^ ex];
  129.         B2 = B2 ^ f[B4 ^ B5];
  130.         B1 = B1 ^ f[B4 ^ Key[i--] ^ ex];
  131.     }
  132. }
  133. /* Notes:
  134.      The original NEWDES algorithm was vulnerable to a related-key 
  135. attack using a large number of chosen plaintexts.  The weakness was 
  136. due to the simple key expansion algorithm which made key rotation by 
  137. seven bytes cause the last 15 rounds to be the same as the first 15 
  138. rounds using the un-rotated key.  The revised key expansion uses 
  139. the 15 key bytes exclusive-ored with 0, 1, 2 and 3 to generate 60 
  140. unique bytes of expanded key.
  141.      The original C-language representation of the algorithm used a 
  142. single function to do both encryption and decryption, the difference 
  143. being in the setting of three global variables.  Even though the 
  144. idea could be extended to include this new key expansion algorithm, 
  145. it seemed that the benefits of streamlined encrypt() and decrypt() 
  146. functions now outweigh the advantages using only one function.  Note 
  147. that the algorithm could run even faster if the 60-byte expanded key 
  148. were pre-computed in an array.
  149. */