Kamélia | |
---|---|
Teremtő | Mitsubishi |
Létrehozva | 2000 |
közzétett | 2000 |
Kulcsméret | 128, 192 vagy 256 bites |
Blokkméret | 128 bites |
A körök száma | 18 vagy 24 |
Típusú | Feistel hálózat |
A Camellia egy szimmetrikus blokk-rejtjel - algoritmus (blokkméret 128 bit, kulcs 128, 192, 256 bit ), az európai NESSIE verseny egyik döntőse (az AES és a Shacal-2 mellett ), amelyet a Nippon Telegraph és a Telephone Corporation japán cégek fejlesztettek ki. és a Mitsubishi Electric Corporation (benyújtva 2000. március 10. ). A japán CRYPTREC szervezet által tanúsított , ipari és kormányzati használatra ajánlott algoritmus.
A Camellia az E2 titkosítási algoritmus továbbfejlesztése , amely az AES versenyre beküldött algoritmusok egyike, és a MISTY1 algoritmus elemeit használja fel .
Az algoritmus felépítése a klasszikus Feistel láncon alapul, előzetes és végső fehérítéssel . A hurokfüggvény nemlineáris transzformációt (S-boxok), 16 ciklusonként lineáris szórási blokkot (byte-byte XOR művelet ) és bájt permutációt használ.
A kulcs hosszától függően 18 ciklusból áll (128 bites kulcs) vagy 24 ciklusból (192 és 256 bites kulcs).
A Camellia algoritmus támogatását 2008 - ban vezették be a Mozilla Firefox 3-ban, de 2014 - ben letiltották a Mozilla Firefox 33-ban [1] . Az algoritmus szabadalmaztatott, de számos ingyenes licenc alatt terjesztik, különösen az OpenSSL projekt része .
Kijelölés | Jelentése |
---|---|
& | Bitenkénti ÉS (ÉS) |
| | Bitenkénti VAGY (VAGY) |
^ | Bitenkénti exkluzív VAGY (XOR) |
<< | Logikai eltolás balra |
>> | Logikai jobbra váltás |
<<< | Forgasd balra |
~y | Inverzió |
Állandó | Jelentése |
---|---|
MASZK8 | 0xff |
MASZK32 | 0xffffffff |
MASZK64 | 0xffffffffffffffff |
MASZK128 | 0xffffffffffffffffffffffffffffffff |
C1 | 0xA09E667F3BCC908B |
C2 | 0xB67AE8584CAA73B2 |
C3 | 0xC6EF372FE94F82BE |
C4 | 0x54FF53A5F1D36F1C |
C5 | 0x10E527FADE682D1D |
C6 | 0xB05688C2B3E6C1FD |
Kulcs | KL | KR |
---|---|---|
128 | K | 0 |
192 | K >> 64 | ((K & MASK64) << 64) | (~(K&MASK64)) |
256 | K >> 128 | K&MASZK128 |
128 bites
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 és 256 bites
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; |
A titkosítás a Feistel séma szerint történik, 128 bites kulcs esetén 18, 192 és 256 bites kulcsok esetén 24 szakaszban. 6 lépésenként alkalmazza az FL és FLINV funkciókat.
128 bites
D1 = M >> 64; // A titkosított üzenet két 64 bites részre oszlik D2=M&MASZK64; D1 = D1^kw1; // Előfehérítés 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,ke1); // 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, k11); 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; // Végső fehérítés D1=D1^kw4; C = (D2 << 64) | D1; |
192 és 256 bites
D1 = M >> 64; // A titkosított üzenet két 64 bites részre oszlik D2=M&MASZK64; D1 = D1^kw1; // Előfehérítés 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,ke1); // 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, k11); 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; // Végső fehérítés D1=D1^kw4; C = (D2 << 64) | D1; |
Az F-, FL- és FLINV-függvények 2 db 64 bites paramétert kapnak bemenetként - F_IN adatok és KE kulcs.
Az F függvény 16 8 bites t1, ..., t8, y1, ..., y8 és 1 64 bites változót használ. A függvény kimenete egy 64 bites szám.
Az FL és FLINV függvények 4 x1,x2,k1,k2 32 bites változót használnak. A függvény kimenete egy 64 bites szám. FLINV függvény - inverz FL-re
F függvény
x = F_IN^KE; t1 = x >> 56; t2 = (x >> 48) & MASZK8; t3 = (x >> 40) &MASK8; t4 = (x >> 32) &MASK8; t5 = (x >> 24) & MASZK8; t6 = (x >> 16) &MASK8; t7 = (x >> 8) &MASK8; t8=x&MASZK8; 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 funkció
var x1, x2 32 bites előjel nélküli egész számként; var k1, k2 32 bites előjel nélküli egész számként; x1 = FL_IN >> 32; x2 = FL_IN&MASK32; k1 = KE >> 32; k2=KE&MASZK32; x2 = x2^((x1 & k1) <<< 1); x1 = x1^(x2|k2); FL_OUT = (x1 << 32) | x2; |
FLINV funkció
var y1, y2 32 bites előjel nélküli egész számként; var k1, k2 32 bites előjel nélküli egész számként; y1 = FLINV_IN >> 32; y2 = FLINV_IN&MASZK32; k1 = KE >> 32; k2=KE&MASZK32; y1 = y1^(y2|k2); y2 = y2 ^ ((y1 & k1) <<< 1); FLINV_OUT = (y1 << 32) | y2; |
Az SBOX1 függvény értékét a következő táblázat határozza meg:
0 | egy | 2 | 3 | négy | 5 | 6 | 7 | nyolc | 9 | a | b | c | d | e | f | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 112 | 130 | 44 | 236 | 179 | 39 | 192 | 229 | 228 | 133 | 87 | 53 | 234 | 12 | 174 | 65 |
egy | 35 | 239 | 107 | 147 | 69 | 25 | 165 | 33 | 237 | tizennégy | 79 | 78 | 29 | 101 | 146 | 189 |
2 | 134 | 184 | 175 | 143 | 124 | 235 | 31 | 206 | 62 | 48 | 220 | 95 | 94 | 197 | tizenegy | 26 |
3 | 166 | 225 | 57 | 202 | 213 | 71 | 93 | 61 | 217 | egy | 90 | 214 | 81 | 86 | 108 | 77 |
négy | 139 | 13 | 154 | 102 | 251 | 204 | 176 | 45 | 116 | tizennyolc | 43 | 32 | 240 | 177 | 132 | 153 |
5 | 223 | 76 | 203 | 194 | 52 | 126 | 118 | 5 | 109 | 183 | 169 | 49 | 209 | 23 | négy | 215 |
6 | húsz | 88 | 58 | 97 | 222 | 27 | 17 | 28 | ötven | tizenöt | 156 | 22 | 83 | 24 | 242 | 34 |
7 | 254 | 68 | 207 | 178 | 195 | 181 | 122 | 145 | 36 | nyolc | 232 | 168 | 96 | 252 | 105 | 80 |
nyolc | 170 | 208 | 160 | 125 | 161 | 137 | 98 | 151 | 84 | 91 | harminc | 149 | 224 | 255 | 100 | 210 |
9 | 16 | 196 | 0 | 72 | 163 | 247 | 117 | 219 | 138 | 3 | 230 | 218 | 9 | 63 | 221 | 148 |
a | 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 | tíz | 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 |
Például: SBOX1(0x7a)=232.
Az SBOX2, SBOX3 és SBOX4 meghatározása az SBOX1-ből a következőképpen történik:
A visszafejtési algoritmus megegyezik a titkosítással, azzal az egyetlen különbséggel, hogy a segédkulcsokat a következő séma szerint cserélik, az eredeti kulcs hosszától függően:
Kulcsméret | |
---|---|
128 bites | 192 vagy 256 bites |
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 |
Kulcs: 0123456789abcdeffedcba9876543210
Titkosított üzenet: 0123456789abcdefeffedcba9876543210
Titkosított üzenet: 67673138549669730857065648eabe43
Kulcsok
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 |
Az algoritmus szerzői szerint:
Megmutattuk, hogy a differenciális [2] és a lineáris [3] kriptoanalízis sikere szinte lehetetlen egy teljes 18 körből álló Camellia ciklussal szemben. Ezenkívül a Camellia-t úgy tervezték, hogy ellenálljon a kifinomultabb kriptográfiai támadásoknak, mint például a magas szintű differenciális támadásoknak [4] [5] , az interpolációs támadásoknak [6] [7] , a "linked-key" támadásoknak [8] [9] és a rövidített differenciális támadásoknak. [10] [11] és mások
Eredeti szöveg (angol)[ showelrejt] Megerősítettük, hogy rendkívül valószínűtlen, hogy differenciális és lineáris támadások sikerüljenek a teljes 18 körös Camellia ellen. Ezenkívül a Camelliát úgy tervezték, hogy védelmet nyújtson más fejlett kriptoanalitikus támadásokkal szemben, beleértve a magasabb rendű differenciális támadásokat, az interpolációs támadásokat, a kapcsolódó kulcsú támadásokat, a csonka differenciális támadásokat és így tovább.A Camellia támogatása a Mozilla Firefox 3 végleges verziójában 2008-ban jelent meg [12] . Ugyanebben az évben a FreeBSD fejlesztőcsapata bejelentette, hogy a FreeBSD 6.4-RELEASE is tartalmazza ennek a titkosításnak a támogatását. 2009 szeptemberében a GNU Privacy Guard hozzáadta a Camellia támogatását az 1.4.10-es verzióhoz. Emellett számos népszerű biztonsági könyvtár, például a Crypto++, a GnuTLS, a PolarSSL és az OpenSSL [13] is támogatja a Camellia-t.
Algoritmus | Logikai elemek száma | Kulcsszámítási idő, ns | Titkosítási/dekódolási idő, ns | Sávszélesség, Mb/s | ||
---|---|---|---|---|---|---|
Titkosítás/dekódolás | Kulcsok | Teljes mennyiség | ||||
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 |
Kígyó | 298.533 | 205.096 | 503.770 | 114.07 | 137,40 | 931,58 |
Kéthal | 200.165 | 231.682 | 431.857 | 16.38 | 324,80 | 394,08 |
Kamélia | 216.911 | 55.907 | 272.819 | 24.36 | 109,35 | 1170,55 |
Szimmetrikus titkosítási rendszerek | |
---|---|
Rejtjelfolyam adatfolyam | |
Feistel hálózat | |
SP hálózat | |
Egyéb |