xref: /openbsd/lib/libcrypto/rc2/rrc2.doc (revision 5b37fcf3)
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