Camellia | |
---|---|
Skaber | Mitsubishi |
Oprettet | 2000 |
offentliggjort | 2000 |
Nøglestørrelse | 128, 192 eller 256 bit |
Blokstørrelse | 128 bit |
Antal runder | 18 eller 24 |
Type | Feistel netværk |
Camellia er en symmetrisk blokchifferalgoritme ( blokstørrelse 128 bit, nøgle 128, 192, 256 bit ), en af finalisterne i den europæiske NESSIE -konkurrence (sammen med AES og Shacal-2 ), udviklet af japanske virksomheder Nippon Telegraph and Telephone Corporation og Mitsubishi Electric Corporation (indsendt 10. marts 2000 ). Certificeret af den japanske organisation CRYPTREC som en algoritme, der anbefales til industriel og offentlig brug.
Camellia er en videreudvikling af E2 -krypteringsalgoritmen , en af de algoritmer, der er indsendt til AES -konkurrencen og bruger elementer fra MISTY1- algoritmen .
Strukturen af algoritmen er baseret på den klassiske Feistel-kæde med foreløbig og endelig blegning . Sløjfefunktionen bruger en ikke-lineær transformation (S-bokse), en lineær spredningsblok hver 16. cyklus (byte-for-byte XOR -operation ) og en byte-permutation.
Afhængigt af nøglelængden har den 18 cyklusser (128 bit nøgle) eller 24 cyklusser (192 og 256 bit nøgler).
Understøttelse af Camellia-algoritmen blev introduceret i 2008 i Mozilla Firefox 3, men blev deaktiveret i 2014 i Mozilla Firefox 33 [1] . Algoritmen er patenteret, men distribueres under en række gratis licenser, især er den en del af OpenSSL- projektet .
Betegnelse | Betyder |
---|---|
& | Bitvis OG (OG) |
| | Bitvis ELLER (ELLER) |
^ | Bitvist eksklusiv ELLER (XOR) |
<< | Logisk skift til venstre |
>> | Logisk højreskift |
<<< | Drej til venstre |
~y | Inversion |
Konstant | Betyder |
---|---|
MASK 8 | 0xff |
MASK32 | 0xffffffff |
MASK64 | 0xffffffffffffffff |
MASK128 | 0xffffffffffffffffffffffffffffffff |
C1 | 0xA09E667F3BCC908B |
C2 | 0xB67AE8584CAA73B2 |
C3 | 0xC6EF372FE94F82BE |
C4 | 0x54FF53A5F1D36F1C |
C5 | 0x10E527FADE682D1D |
C6 | 0xB05688C2B3E6C1FD |
Nøgle | KL | KR |
---|---|---|
128 | K | 0 |
192 | K >> 64 | ((K & MASK64) << 64) | (~(K&MASK64)) |
256 | K >> 128 | K&MASK128 |
128 bit
kw1 = (KL <<< 0) >> 64; kw2 = (KL <<< 0) & MASK64; k1 = (KA <<< 0) >> 64; k2 = (KA <<< 0) & MASK64; k3 = (KL <<< 15) >> 64; k4 = (KL <<< 15) & MASK64; k5 = (KA <<< 15) >> 64; k6 = (KA <<< 15) & MASK64; ke1 = (KA <<< 30) >> 64; ke2 = (KA <<< 30) & MASK64; k7 = (KL <<< 45) >> 64; k8 = (KL <<< 45) & MASK64; k9 = (KA <<< 45) >> 64; k10 = (KL <<< 60) & MASK64; k11 = (KA <<< 60) >> 64; k12 = (KA <<< 60) & MASK64; ke3 = (KL <<< 77) >> 64; ke4 = (KL <<< 77) & MASK64; k13 = (KL <<< 94) >> 64; k14 = (KL <<< 94) & MASK64; k15 = (KA <<< 94) >> 64; k16 = (KA <<< 94) & MASK64; k17 = (KL <<< 111) >> 64; k18 = (KL <<< 111) & MASK64; kw3 = (KA <<< 111) >> 64; kw4 = (KA <<< 111) & MASK64; |
192 og 256 bit
kw1 = (KL <<< 0) >> 64; kw2 = (KL <<< 0) & MASK64; k1 = (KB <<< 0) >> 64; k2 = (KB <<< 0) & MASK64; k3 = (KR <<< 15) >> 64; k4 = (KR <<< 15) & MASK64; k5 = (KA <<< 15) >> 64; k6 = (KA <<< 15) & MASK64; ke1 = (KR <<< 30) >> 64; ke2 = (KR <<< 30) & MASK64; k7 = (KB <<< 30) >> 64; k8 = (KB <<< 30) & MASK64; k9 = (KL <<< 45) >> 64; k10 = (KL <<< 45) & MASK64; k11 = (KA <<< 45) >> 64; k12 = (KA <<< 45) & MASK64; ke3 = (KL <<< 60) >> 64; ke4 = (KL <<< 60) & MASK64; k13 = (KR <<< 60) >> 64; k14 = (KR <<< 60) & MASK64; k15 = (KB <<< 60) >> 64; k16 = (KB <<< 60) & MASK64; k17 = (KL <<< 77) >> 64; k18 = (KL <<< 77) & MASK64; ke5 = (KA <<< 77) >> 64; ke6 = (KA <<< 77) & MASK64; k19 = (KR <<< 94) >> 64; k20 = (KR <<< 94) & MASK64; k21 = (KA <<< 94) >> 64; k22 = (KA <<< 94) & MASK64; k23 = (KL <<< 111) >> 64; k24 = (KL <<< 111) & MASK64; kw3 = (KB <<< 111) >> 64; kw4 = (KB <<< 111) & MASK64; |
Kryptering sker i henhold til Feistel-skemaet med 18 trin for en 128-bit nøgle og 24 trin for 192- og 256-bit nøgler. Hvert 6. trin anvendes FL- og FLINV-funktionerne.
128 bit
D1 = M >> 64; // Krypteret besked er opdelt i to 64-bit dele D2=M&MASK64; D1 = D1^kw1; // Forblegning D2 = D2^kw2; D2 = D2 ^ F(D1, k1); D1 = D1 ^ F(D2, k2); D2 = D2 ^ F(D1, k3); D1 = D1 ^ F(D2, k4); D2 = D2 ^ F(D1, k5); D1 = D1 ^ F(D2, k6); D1 = FL(D1, kel); // FL D2 = FLINV(D2, ke2); // FLINV D2 = D2 ^ F(D1, k7); D1 = D1 ^ F(D2, k8); D2 = D2 ^ F(D1, k9); D1 = D1 ^ F(D2, k10); D2 = D2 ^ F(D1, kll); D1 = D1 ^ F(D2, k12); D1 = FL(D1, ke3); // FL D2 = FLINV(D2, ke4); // FLINV D2 = D2 ^ F(D1, k13); D1 = D1 ^ F(D2, k14); D2 = D2 ^ F(D1, k15); D1 = D1 ^ F(D2, k16); D2 = D2 ^ F(D1, k17); D1 = D1 ^ F(D2, k18); D2 = D2^kw3; // Endelig blegning D1=D1^kw4; C = (D2 << 64) | D1; |
192 og 256 bit
D1 = M >> 64; // Krypteret besked er opdelt i to 64-bit dele D2=M&MASK64; D1 = D1^kw1; // Forblegning D2 = D2^kw2; D2 = D2 ^ F(D1, k1); D1 = D1 ^ F(D2, k2); D2 = D2 ^ F(D1, k3); D1 = D1 ^ F(D2, k4); D2 = D2 ^ F(D1, k5); D1 = D1 ^ F(D2, k6); D1 = FL(D1, kel); // FL D2 = FLINV(D2, ke2); // FLINV D2 = D2 ^ F(D1, k7); D1 = D1 ^ F(D2, k8); D2 = D2 ^ F(D1, k9); D1 = D1 ^ F(D2, k10); D2 = D2 ^ F(D1, kll); D1 = D1 ^ F(D2, k12); D1 = FL(D1, ke3); // FL D2 = FLINV(D2, ke4); // FLINV D2 = D2 ^ F(D1, k13); D1 = D1 ^ F(D2, k14); D2 = D2 ^ F(D1, k15); D1 = D1 ^ F(D2, k16); D2 = D2 ^ F(D1, k17); D1 = D1 ^ F(D2, k18); D1 = FL(D1, ke5); // FL D2 = FLINV(D2, ke6); // FLINV D2 = D2 ^ F(D1, k19); D1 = D1 ^ F(D2, k20); D2 = D2 ^ F(D1, k21); D1 = D1 ^ F(D2, k22); D2 = D2 ^ F(D1, k23); D1 = D1 ^ F(D2, k24); D2 = D2^kw3; // Endelig blegning D1=D1^kw4; C = (D2 << 64) | D1; |
F-, FL- og FLINV-funktioner modtager 2 64-bit parametre som input - F_IN data og KE nøgle.
F-funktionen bruger 16 8-bit variable t1, ..., t8, y1, ..., y8 og 1 64-bit variabel. Funktionens output er et 64-bit tal.
FL- og FLINV-funktionerne bruger 4 32-bit variable x1,x2,k1,k2. Funktionens output er et 64-bit tal. FLINV funktion - omvendt til FL
F-funktion
x = F_IN^KE; t1 = x >> 56; t2 = (x >> 48) & MASK8; t3 = (x >> 40) &MASK8; t4 = (x >> 32) &MASK8; t5 = (x >> 24) & MASK8; t6 = (x >> 16) &MASK8; t7 = (x >> 8) &MASK8; t8=x&MASK8; t1 = SBOX1[t1]; t2 = SBOX2[t2]; t3 = SBOX3[t3]; t4 = SBOX4[t4]; t5 = SBOX2[t5]; t6 = SBOX3[t6]; t7 = SBOX4[t7]; t8 = SBOX1[t8]; y1 = t1 ^ t3 ^ t4 ^ t6 ^ t7 ^ t8; y2 = t1^t2^t4^t5^t7^t8; y3 = t1^t2^t3^t5^t6^t8; y4 = t2^t3^t4^t5^t6^t7; y5 = t1^t2^t6^t7^t8; y6 = t2^t3^t5^t7^t8; y7 = t3^t4^t5^t6^t8; y8 = t1^t4^t5^t6^t7; F_OUT = (y1 << 56) | (y2 << 48) | (y3 << 40) | (y4 << 32)| (y5 << 24) | (y6 << 16) | (y7 << 8) | y8; |
FL funktion
var x1, x2 som 32-bit heltal uden fortegn; var k1, k2 som 32-bit heltal uden fortegn; x1 = FL_IN >> 32; x2 = FL_IN&MASK32; k1 = KE >> 32; k2=KE&MASK32; x2 = x2^((x1 & k1) <<< 1); x1 = x1^(x2|k2); FL_OUT = (x1 << 32) | x2; |
FLINV funktion
var y1, y2 som 32-bit heltal uden fortegn; var k1, k2 som 32-bit heltal uden fortegn; y1 = FLINV_IN >> 32; y2 = FLINV_IN&MASK32; k1 = KE >> 32; k2=KE&MASK32; y1 = yl^(y2|k2); y2 = y2 ^ ((yl & k1) <<< 1); FLINV_OUT = (y1 << 32) | y2; |
Værdien af SBOX1-funktionen bestemmes ud fra følgende tabel:
0 | en | 2 | 3 | fire | 5 | 6 | 7 | otte | 9 | -en | b | c | d | e | f | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 112 | 130 | 44 | 236 | 179 | 39 | 192 | 229 | 228 | 133 | 87 | 53 | 234 | 12 | 174 | 65 |
en | 35 | 239 | 107 | 147 | 69 | 25 | 165 | 33 | 237 | fjorten | 79 | 78 | 29 | 101 | 146 | 189 |
2 | 134 | 184 | 175 | 143 | 124 | 235 | 31 | 206 | 62 | 48 | 220 | 95 | 94 | 197 | elleve | 26 |
3 | 166 | 225 | 57 | 202 | 213 | 71 | 93 | 61 | 217 | en | 90 | 214 | 81 | 86 | 108 | 77 |
fire | 139 | 13 | 154 | 102 | 251 | 204 | 176 | 45 | 116 | atten | 43 | 32 | 240 | 177 | 132 | 153 |
5 | 223 | 76 | 203 | 194 | 52 | 126 | 118 | 5 | 109 | 183 | 169 | 49 | 209 | 23 | fire | 215 |
6 | tyve | 88 | 58 | 97 | 222 | 27 | 17 | 28 | halvtreds | femten | 156 | 22 | 83 | 24 | 242 | 34 |
7 | 254 | 68 | 207 | 178 | 195 | 181 | 122 | 145 | 36 | otte | 232 | 168 | 96 | 252 | 105 | 80 |
otte | 170 | 208 | 160 | 125 | 161 | 137 | 98 | 151 | 84 | 91 | tredive | 149 | 224 | 255 | 100 | 210 |
9 | 16 | 196 | 0 | 72 | 163 | 247 | 117 | 219 | 138 | 3 | 230 | 218 | 9 | 63 | 221 | 148 |
-en | 135 | 92 | 131 | 2 | 205 | 74 | 144 | 51 | 115 | 103 | 246 | 243 | 157 | 127 | 191 | 226 |
b | 82 | 155 | 216 | 38 | 200 | 55 | 198 | 59 | 129 | 150 | 111 | 75 | 19 | 190 | 99 | 46 |
c | 233 | 121 | 167 | 140 | 159 | 110 | 188 | 142 | 41 | 245 | 249 | 182 | 47 | 253 | 180 | 89 |
d | 120 | 152 | 6 | 106 | 231 | 70 | 113 | 186 | 212 | 37 | 171 | 66 | 136 | 162 | 141 | 250 |
e | 114 | 7 | 185 | 85 | 248 | 238 | 172 | ti | 54 | 73 | 42 | 104 | 60 | 56 | 241 | 164 |
f | 64 | 40 | 211 | 123 | 187 | 201 | 67 | 193 | 21 | 227 | 173 | 244 | 119 | 199 | 128 | 158 |
For eksempel: SBOX1(0x7a)=232.
SBOX2, SBOX3 og SBOX4 er defineret fra SBOX1 som følger:
Dekrypteringsalgoritmen er identisk med kryptering, med den eneste forskel, at hjælpenøglerne byttes i henhold til følgende skema, afhængigt af længden af den originale nøgle:
Nøglestørrelse | |
---|---|
128 bit | 192 eller 256 bit |
kw1 <-> kw3 | kw1 <-> kw3 |
kw2 <-> kw4 | kw2 <-> kw4 |
k1 <-> k18 | k1 <-> k24 |
k2 <-> k17 | k2 <-> k23 |
k3 <-> k16 | k3 <-> k22 |
k4 <-> k15 | k4 <-> k21 |
k5 <-> k14 | k5 <-> k20 |
k6 <-> k13 | k6 <-> k19 |
k7 <-> k12 | k7 <-> k18 |
k8 <-> k11 | k8 <-> k17 |
k9 <-> k10 | k9 <-> k16 |
k10 <-> k15 | |
k11 <-> k14 | |
k12 <-> k13 | |
ke1 <-> ke4 | ke1 <-> ke6 |
ke2 <-> ke3 | ke2 <-> ke5 |
ke3 <-> ke4 |
Nøgle: 0123456789abcdeffedcba9876543210
Krypteret besked: 0123456789abcdefeffedcba9876543210
Krypteret besked: 67673138549669730857065648eabe43
Nøgler
k[1]=ae71c3d55ba6bf1d k[2]=169240a795f89256 k[3]=a2b3c4d5e6f7ff6e k[4]=5d4c3b2a19080091 k[5]=e1eaadd35f8e8b49 k[6]=2053cafc492b5738 k[7]=79bdffdb97530eca k[8]=8642002468acf135 k[9]=d7e3a2d24814f2bf k[10]=00123456789abcde k[11]=d169240a795f8ukv k[12]=6ae71c3d55ba6bf1 k[13]=1d950c840048d159 k[14]=e26af37bffb72ea6 k[15]=e57e2495ab9c70f5 k[16]=56e9afc745a49029 kw[1]=0123456789abcdef kw[2]=fedcba9876543210 kw[3]=492b5738e1eaadd3 kw[4]=5f8e8b492053cafc ke[1]=56e9afc745a49029 ke[2]=e57e2495ab9c70f5 ke[3]=97530eca86420024 ke[4]=68acf13579bdffdb |
Ifølge forfatterne af algoritmen:
Vi har vist, at succesen med differentiel [2] og lineær [3] kryptoanalyse er næsten umulig i forhold til en fuld 18-runders Camellia-cyklus. Desuden blev Camellia designet til at modstå mere sofistikerede kryptografiske angreb såsom højordens differentielle angreb [4] [5] , interpolationsangreb [6] [7] , "linked-key" angreb [8] [9] , forkortede differentielle angreb [10] [11] og andre
Originaltekst (engelsk)[ Visskjule] Vi bekræftede, at det er ekstremt usandsynligt, at differentielle og lineære angreb vil lykkes mod hele 18-runders Camellia. Derudover er Camellia designet til at tilbyde sikkerhed mod andre avancerede kryptoanalytiske angreb, herunder højere ordens differentiale angreb, interpolationsangreb, relaterede nøgleangreb, trunkerede differentielle angreb og så videreUnderstøttelse af Camellia blev tilføjet i den endelige version af Mozilla Firefox 3 i 2008 [12] . Senere samme år annoncerede FreeBSD-udviklingsteamet, at understøttelse af denne kryptering også var inkluderet i FreeBSD 6.4-RELEASE. I september 2009 tilføjede GNU Privacy Guard understøttelse af Camellia i version 1.4.10. Derudover inkluderer mange populære sikkerhedsbiblioteker såsom Crypto++, GnuTLS, PolarSSL og OpenSSL [13] også understøttelse af Camellia.
Algoritme | Antal logiske elementer | Nøgleberegningstid, ns | Kryptering/dekrypteringstid, ns | Båndbredde, Mb/s | ||
---|---|---|---|---|---|---|
Kryptering/dekryptering | Nøgler | Samlet mængde | ||||
DES | 42,204 | 12.201 | 54.405 | - | 55,11 | 1161,31 |
Triple-DES | 124.888 | 23.207 | 128,147 | - | 157,09 | 407,40 |
MARS | 690.654 | 2.245.096 | 2.935.754 | 1740,99 | 567,49 | 225,55 |
RC6 | 741.641 | 901.382 | 1.643.037 | 2112,26 | 627,57 | 203,96 |
Rijndael | 518.508 | 93,708 | 612.834 | 57,39 | 65,64 | 1950.03 |
Slange | 298.533 | 205.096 | 503.770 | 114,07 | 137,40 | 931,58 |
To fisk | 200,165 | 231.682 | 431.857 | 16.38 | 324,80 | 394,08 |
Camellia | 216,911 | 55,907 | 272.819 | 24.36 | 109,35 | 1170,55 |
Symmetriske kryptosystemer | |
---|---|
Stream-cifre | |
Feistel netværk | |
SP netværk | |
Andet |