1*5b37fcf3Sryker>From cygnus.mincom.oz.au!minbne.mincom.oz.au!bunyip.cc.uq.oz.au!munnari.OZ.AU!comp.vuw.ac.nz!waikato!auckland.ac.nz!news Mon Feb 12 18:48:17 EST 1996 2*5b37fcf3SrykerArticle 23601 of sci.crypt: 3*5b37fcf3SrykerPath: cygnus.mincom.oz.au!minbne.mincom.oz.au!bunyip.cc.uq.oz.au!munnari.OZ.AU!comp.vuw.ac.nz!waikato!auckland.ac.nz!news 4*5b37fcf3Sryker>From: pgut01@cs.auckland.ac.nz (Peter Gutmann) 5*5b37fcf3SrykerNewsgroups: sci.crypt 6*5b37fcf3SrykerSubject: Specification for Ron Rivests Cipher No.2 7*5b37fcf3SrykerDate: 11 Feb 1996 06:45:03 GMT 8*5b37fcf3SrykerOrganization: University of Auckland 9*5b37fcf3SrykerLines: 203 10*5b37fcf3SrykerSender: pgut01@cs.auckland.ac.nz (Peter Gutmann) 11*5b37fcf3SrykerMessage-ID: <4fk39f$f70@net.auckland.ac.nz> 12*5b37fcf3SrykerNNTP-Posting-Host: cs26.cs.auckland.ac.nz 13*5b37fcf3SrykerX-Newsreader: NN version 6.5.0 #3 (NOV) 14*5b37fcf3Sryker 15*5b37fcf3Sryker 16*5b37fcf3Sryker 17*5b37fcf3Sryker 18*5b37fcf3Sryker Ron Rivest's Cipher No.2 19*5b37fcf3Sryker ------------------------ 20*5b37fcf3Sryker 21*5b37fcf3SrykerRon Rivest's Cipher No.2 (hereafter referred to as RRC.2, other people may 22*5b37fcf3Srykerrefer to it by other names) is word oriented, operating on a block of 64 bits 23*5b37fcf3Srykerdivided into four 16-bit words, with a key table of 64 words. All data units 24*5b37fcf3Srykerare little-endian. This functional description of the algorithm is based in 25*5b37fcf3Srykerthe paper "The RC5 Encryption Algorithm" (RC5 is a trademark of RSADSI), using 26*5b37fcf3Srykerthe same general layout, terminology, and pseudocode style. 27*5b37fcf3Sryker 28*5b37fcf3Sryker 29*5b37fcf3SrykerNotation and RRC.2 Primitive Operations 30*5b37fcf3Sryker 31*5b37fcf3SrykerRRC.2 uses the following primitive operations: 32*5b37fcf3Sryker 33*5b37fcf3Sryker1. Two's-complement addition of words, denoted by "+". The inverse operation, 34*5b37fcf3Sryker subtraction, is denoted by "-". 35*5b37fcf3Sryker2. Bitwise exclusive OR, denoted by "^". 36*5b37fcf3Sryker3. Bitwise AND, denoted by "&". 37*5b37fcf3Sryker4. Bitwise NOT, denoted by "~". 38*5b37fcf3Sryker5. A left-rotation of words; the rotation of word x left by y is denoted 39*5b37fcf3Sryker x <<< y. The inverse operation, right-rotation, is denoted x >>> y. 40*5b37fcf3Sryker 41*5b37fcf3SrykerThese operations are directly and efficiently supported by most processors. 42*5b37fcf3Sryker 43*5b37fcf3Sryker 44*5b37fcf3SrykerThe RRC.2 Algorithm 45*5b37fcf3Sryker 46*5b37fcf3SrykerRRC.2 consists of three components, a *key expansion* algorithm, an 47*5b37fcf3Sryker*encryption* algorithm, and a *decryption* algorithm. 48*5b37fcf3Sryker 49*5b37fcf3Sryker 50*5b37fcf3SrykerKey Expansion 51*5b37fcf3Sryker 52*5b37fcf3SrykerThe purpose of the key-expansion routine is to expand the user's key K to fill 53*5b37fcf3Srykerthe expanded key array S, so S resembles an array of random binary words 54*5b37fcf3Srykerdetermined by the user's secret key K. 55*5b37fcf3Sryker 56*5b37fcf3SrykerInitialising the S-box 57*5b37fcf3Sryker 58*5b37fcf3SrykerRRC.2 uses a single 256-byte S-box derived from the ciphertext contents of 59*5b37fcf3SrykerBeale Cipher No.1 XOR'd with a one-time pad. The Beale Ciphers predate modern 60*5b37fcf3Srykercryptography by enough time that there should be no concerns about trapdoors 61*5b37fcf3Srykerhidden in the data. They have been published widely, and the S-box can be 62*5b37fcf3Srykereasily recreated from the one-time pad values and the Beale Cipher data taken 63*5b37fcf3Srykerfrom a standard source. To initialise the S-box: 64*5b37fcf3Sryker 65*5b37fcf3Sryker for i = 0 to 255 do 66*5b37fcf3Sryker sBox[ i ] = ( beale[ i ] mod 256 ) ^ pad[ i ] 67*5b37fcf3Sryker 68*5b37fcf3SrykerThe contents of Beale Cipher No.1 and the necessary one-time pad are given as 69*5b37fcf3Srykeran appendix at the end of this document. For efficiency, implementors may wish 70*5b37fcf3Srykerto skip the Beale Cipher expansion and store the sBox table directly. 71*5b37fcf3Sryker 72*5b37fcf3SrykerExpanding the Secret Key to 128 Bytes 73*5b37fcf3Sryker 74*5b37fcf3SrykerThe secret key is first expanded to fill 128 bytes (64 words). The expansion 75*5b37fcf3Srykerconsists of taking the sum of the first and last bytes in the user key, looking 76*5b37fcf3Srykerup the sum (modulo 256) in the S-box, and appending the result to the key. The 77*5b37fcf3Srykeroperation is repeated with the second byte and new last byte of the key until 78*5b37fcf3Srykerall 128 bytes have been generated. Note that the following pseudocode treats 79*5b37fcf3Srykerthe S array as an array of 128 bytes rather than 64 words. 80*5b37fcf3Sryker 81*5b37fcf3Sryker for j = 0 to length-1 do 82*5b37fcf3Sryker S[ j ] = K[ j ] 83*5b37fcf3Sryker for j = length to 127 do 84*5b37fcf3Sryker s[ j ] = sBox[ ( S[ j-length ] + S[ j-1 ] ) mod 256 ]; 85*5b37fcf3Sryker 86*5b37fcf3SrykerAt this point it is possible to perform a truncation of the effective key 87*5b37fcf3Srykerlength to ease the creation of espionage-enabled software products. However 88*5b37fcf3Srykersince the author cannot conceive why anyone would want to do this, it will not 89*5b37fcf3Srykerbe considered further. 90*5b37fcf3Sryker 91*5b37fcf3SrykerThe final phase of the key expansion involves replacing the first byte of S 92*5b37fcf3Srykerwith the entry selected from the S-box: 93*5b37fcf3Sryker 94*5b37fcf3Sryker S[ 0 ] = sBox[ S[ 0 ] ] 95*5b37fcf3Sryker 96*5b37fcf3Sryker 97*5b37fcf3SrykerEncryption 98*5b37fcf3Sryker 99*5b37fcf3SrykerThe cipher has 16 full rounds, each divided into 4 subrounds. Two of the full 100*5b37fcf3Srykerrounds perform an additional transformation on the data. Note that the 101*5b37fcf3Srykerfollowing pseudocode treats the S array as an array of 64 words rather than 128 102*5b37fcf3Srykerbytes. 103*5b37fcf3Sryker 104*5b37fcf3Sryker for i = 0 to 15 do 105*5b37fcf3Sryker j = i * 4; 106*5b37fcf3Sryker word0 = ( word0 + ( word1 & ~word3 ) + ( word2 & word3 ) + S[ j+0 ] ) <<< 1 107*5b37fcf3Sryker word1 = ( word1 + ( word2 & ~word0 ) + ( word3 & word0 ) + S[ j+1 ] ) <<< 2 108*5b37fcf3Sryker word2 = ( word2 + ( word3 & ~word1 ) + ( word0 & word1 ) + S[ j+2 ] ) <<< 3 109*5b37fcf3Sryker word3 = ( word3 + ( word0 & ~word2 ) + ( word1 & word2 ) + S[ j+3 ] ) <<< 5 110*5b37fcf3Sryker 111*5b37fcf3SrykerIn addition the fifth and eleventh rounds add the contents of the S-box indexed 112*5b37fcf3Srykerby one of the data words to another of the data words following the four 113*5b37fcf3Srykersubrounds as follows: 114*5b37fcf3Sryker 115*5b37fcf3Sryker word0 = word0 + S[ word3 & 63 ]; 116*5b37fcf3Sryker word1 = word1 + S[ word0 & 63 ]; 117*5b37fcf3Sryker word2 = word2 + S[ word1 & 63 ]; 118*5b37fcf3Sryker word3 = word3 + S[ word2 & 63 ]; 119*5b37fcf3Sryker 120*5b37fcf3Sryker 121*5b37fcf3SrykerDecryption 122*5b37fcf3Sryker 123*5b37fcf3SrykerThe decryption operation is simply the inverse of the encryption operation. 124*5b37fcf3SrykerNote that the following pseudocode treats the S array as an array of 64 words 125*5b37fcf3Srykerrather than 128 bytes. 126*5b37fcf3Sryker 127*5b37fcf3Sryker for i = 15 downto 0 do 128*5b37fcf3Sryker j = i * 4; 129*5b37fcf3Sryker word3 = ( word3 >>> 5 ) - ( word0 & ~word2 ) - ( word1 & word2 ) - S[ j+3 ] 130*5b37fcf3Sryker word2 = ( word2 >>> 3 ) - ( word3 & ~word1 ) - ( word0 & word1 ) - S[ j+2 ] 131*5b37fcf3Sryker word1 = ( word1 >>> 2 ) - ( word2 & ~word0 ) - ( word3 & word0 ) - S[ j+1 ] 132*5b37fcf3Sryker word0 = ( word0 >>> 1 ) - ( word1 & ~word3 ) - ( word2 & word3 ) - S[ j+0 ] 133*5b37fcf3Sryker 134*5b37fcf3SrykerIn addition the fifth and eleventh rounds subtract the contents of the S-box 135*5b37fcf3Srykerindexed by one of the data words from another one of the data words following 136*5b37fcf3Srykerthe four subrounds as follows: 137*5b37fcf3Sryker 138*5b37fcf3Sryker word3 = word3 - S[ word2 & 63 ] 139*5b37fcf3Sryker word2 = word2 - S[ word1 & 63 ] 140*5b37fcf3Sryker word1 = word1 - S[ word0 & 63 ] 141*5b37fcf3Sryker word0 = word0 - S[ word3 & 63 ] 142*5b37fcf3Sryker 143*5b37fcf3Sryker 144*5b37fcf3SrykerTest Vectors 145*5b37fcf3Sryker 146*5b37fcf3SrykerThe following test vectors may be used to test the correctness of an RRC.2 147*5b37fcf3Srykerimplementation: 148*5b37fcf3Sryker 149*5b37fcf3Sryker Key: 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 150*5b37fcf3Sryker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 151*5b37fcf3Sryker Plain: 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 152*5b37fcf3Sryker Cipher: 0x1C, 0x19, 0x8A, 0x83, 0x8D, 0xF0, 0x28, 0xB7 153*5b37fcf3Sryker 154*5b37fcf3Sryker Key: 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 155*5b37fcf3Sryker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 156*5b37fcf3Sryker Plain: 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 157*5b37fcf3Sryker Cipher: 0x21, 0x82, 0x9C, 0x78, 0xA9, 0xF9, 0xC0, 0x74 158*5b37fcf3Sryker 159*5b37fcf3Sryker Key: 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 160*5b37fcf3Sryker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 161*5b37fcf3Sryker Plain: 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 162*5b37fcf3Sryker Cipher: 0x13, 0xDB, 0x35, 0x17, 0xD3, 0x21, 0x86, 0x9E 163*5b37fcf3Sryker 164*5b37fcf3Sryker Key: 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 165*5b37fcf3Sryker 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F 166*5b37fcf3Sryker Plain: 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 167*5b37fcf3Sryker Cipher: 0x50, 0xDC, 0x01, 0x62, 0xBD, 0x75, 0x7F, 0x31 168*5b37fcf3Sryker 169*5b37fcf3Sryker 170*5b37fcf3SrykerAppendix: Beale Cipher No.1, "The Locality of the Vault", and One-time Pad for 171*5b37fcf3Sryker Creating the S-Box 172*5b37fcf3Sryker 173*5b37fcf3SrykerBeale Cipher No.1. 174*5b37fcf3Sryker 175*5b37fcf3Sryker 71, 194, 38,1701, 89, 76, 11, 83,1629, 48, 94, 63, 132, 16, 111, 95, 176*5b37fcf3Sryker 84, 341, 975, 14, 40, 64, 27, 81, 139, 213, 63, 90,1120, 8, 15, 3, 177*5b37fcf3Sryker 126,2018, 40, 74, 758, 485, 604, 230, 436, 664, 582, 150, 251, 284, 308, 231, 178*5b37fcf3Sryker 124, 211, 486, 225, 401, 370, 11, 101, 305, 139, 189, 17, 33, 88, 208, 193, 179*5b37fcf3Sryker 145, 1, 94, 73, 416, 918, 263, 28, 500, 538, 356, 117, 136, 219, 27, 176, 180*5b37fcf3Sryker 130, 10, 460, 25, 485, 18, 436, 65, 84, 200, 283, 118, 320, 138, 36, 416, 181*5b37fcf3Sryker 280, 15, 71, 224, 961, 44, 16, 401, 39, 88, 61, 304, 12, 21, 24, 283, 182*5b37fcf3Sryker 134, 92, 63, 246, 486, 682, 7, 219, 184, 360, 780, 18, 64, 463, 474, 131, 183*5b37fcf3Sryker 160, 79, 73, 440, 95, 18, 64, 581, 34, 69, 128, 367, 460, 17, 81, 12, 184*5b37fcf3Sryker 103, 820, 62, 110, 97, 103, 862, 70, 60,1317, 471, 540, 208, 121, 890, 346, 185*5b37fcf3Sryker 36, 150, 59, 568, 614, 13, 120, 63, 219, 812,2160,1780, 99, 35, 18, 21, 186*5b37fcf3Sryker 136, 872, 15, 28, 170, 88, 4, 30, 44, 112, 18, 147, 436, 195, 320, 37, 187*5b37fcf3Sryker 122, 113, 6, 140, 8, 120, 305, 42, 58, 461, 44, 106, 301, 13, 408, 680, 188*5b37fcf3Sryker 93, 86, 116, 530, 82, 568, 9, 102, 38, 416, 89, 71, 216, 728, 965, 818, 189*5b37fcf3Sryker 2, 38, 121, 195, 14, 326, 148, 234, 18, 55, 131, 234, 361, 824, 5, 81, 190*5b37fcf3Sryker 623, 48, 961, 19, 26, 33, 10,1101, 365, 92, 88, 181, 275, 346, 201, 206 191*5b37fcf3Sryker 192*5b37fcf3SrykerOne-time Pad. 193*5b37fcf3Sryker 194*5b37fcf3Sryker 158, 186, 223, 97, 64, 145, 190, 190, 117, 217, 163, 70, 206, 176, 183, 194, 195*5b37fcf3Sryker 146, 43, 248, 141, 3, 54, 72, 223, 233, 153, 91, 210, 36, 131, 244, 161, 196*5b37fcf3Sryker 105, 120, 113, 191, 113, 86, 19, 245, 213, 221, 43, 27, 242, 157, 73, 213, 197*5b37fcf3Sryker 193, 92, 166, 10, 23, 197, 112, 110, 193, 30, 156, 51, 125, 51, 158, 67, 198*5b37fcf3Sryker 197, 215, 59, 218, 110, 246, 181, 0, 135, 76, 164, 97, 47, 87, 234, 108, 199*5b37fcf3Sryker 144, 127, 6, 6, 222, 172, 80, 144, 22, 245, 207, 70, 227, 182, 146, 134, 200*5b37fcf3Sryker 119, 176, 73, 58, 135, 69, 23, 198, 0, 170, 32, 171, 176, 129, 91, 24, 201*5b37fcf3Sryker 126, 77, 248, 0, 118, 69, 57, 60, 190, 171, 217, 61, 136, 169, 196, 84, 202*5b37fcf3Sryker 168, 167, 163, 102, 223, 64, 174, 178, 166, 239, 242, 195, 249, 92, 59, 38, 203*5b37fcf3Sryker 241, 46, 236, 31, 59, 114, 23, 50, 119, 186, 7, 66, 212, 97, 222, 182, 204*5b37fcf3Sryker 230, 118, 122, 86, 105, 92, 179, 243, 255, 189, 223, 164, 194, 215, 98, 44, 205*5b37fcf3Sryker 17, 20, 53, 153, 137, 224, 176, 100, 208, 114, 36, 200, 145, 150, 215, 20, 206*5b37fcf3Sryker 87, 44, 252, 20, 235, 242, 163, 132, 63, 18, 5, 122, 74, 97, 34, 97, 207*5b37fcf3Sryker 142, 86, 146, 221, 179, 166, 161, 74, 69, 182, 88, 120, 128, 58, 76, 155, 208*5b37fcf3Sryker 15, 30, 77, 216, 165, 117, 107, 90, 169, 127, 143, 181, 208, 137, 200, 127, 209*5b37fcf3Sryker 170, 195, 26, 84, 255, 132, 150, 58, 103, 250, 120, 221, 237, 37, 8, 99 210*5b37fcf3Sryker 211*5b37fcf3Sryker 212*5b37fcf3SrykerImplementation 213*5b37fcf3Sryker 214*5b37fcf3SrykerA non-US based programmer who has never seen any encryption code before will 215*5b37fcf3Srykershortly be implementing RRC.2 based solely on this specification and not on 216*5b37fcf3Srykerknowledge of any other encryption algorithms. Stand by. 217*5b37fcf3Sryker 218*5b37fcf3Sryker 219*5b37fcf3Sryker 220