Kamélie | |
---|---|
Tvůrce | Mitsubishi |
Vytvořeno | 2000 |
zveřejněno | 2000 |
Velikost klíče | 128, 192 nebo 256 bitů |
Velikost bloku | 128 bit |
Počet kol | 18 nebo 24 |
Typ | Síť Feistel |
Camellia je symetrický algoritmus blokové šifry (velikost bloku 128 bitů, klíč 128, 192, 256 bitů ), jeden z finalistů evropské soutěže NESSIE (spolu s AES a Shacal-2 ), vyvinutý japonskými společnostmi Nippon Telegraph a Telephone Corporation. a Mitsubishi Electric Corporation (předloženo 10. března 2000 ). Certifikováno japonskou organizací CRYPTREC jako algoritmus doporučený pro průmyslové a vládní použití.
Camellia je dalším vývojem šifrovacího algoritmu E2 , jednoho z algoritmů přihlášených do soutěže AES a využívajícího prvky algoritmu MISTY1 .
Struktura algoritmu je založena na klasickém Feistelově řetězci s předběžným a konečným bělením . Funkce smyčky používá nelineární transformaci (S-boxy), blok lineárního rozptylu každých 16 cyklů ( operace XOR bajt po bajtu ) a bajtovou permutaci.
V závislosti na délce klíče má 18 cyklů (128bitový klíč) nebo 24 cyklů (192 a 256bitový klíč).
Podpora pro algoritmus Camellia byla představena v roce 2008 v Mozilla Firefox 3, ale byla deaktivována v roce 2014 v Mozilla Firefox 33 [1] . Algoritmus je patentován, ale distribuován pod řadou bezplatných licencí, zejména je součástí projektu OpenSSL .
Označení | Význam |
---|---|
& | Bitové AND (AND) |
| | Bitové NEBO (NEBO) |
^ | Bitový exkluzivní OR (XOR) |
<< | Logický posun doleva |
>> | Logický posun doprava |
<<< | Otočit doleva |
~y | Inverze |
Konstantní | Význam |
---|---|
MASKA8 | 0xff |
MASKA32 | 0xffffffff |
MASKA64 | 0xffffffffffffffff |
MASKA128 | 0xffffffffffffffffffffffffffffffff |
C1 | 0xA09E667F3BCC908B |
C2 | 0xB67AE8584CAA73B2 |
C3 | 0xC6EF372FE94F82BE |
C4 | 0x54FF53A5F1D36F1C |
C5 | 0x10E527FADE682D1D |
C6 | 0xB05688C2B3E6C1FD |
Klíč | 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 a 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; |
Šifrování probíhá podle Feistelova schématu s 18 stupni pro 128bitový klíč a 24 stupni pro 192bitové a 256bitové klíče. Každých 6 kroků se použijí funkce FL a FLINV.
128 bit
Dl = M> 64; // Šifrovaná zpráva je rozdělena na dvě 64bitové části D2=M&MASK64; D1 = D1^kw1; // Předbělení D2 = D2^kw2; D2 = D2^ F(D1, k1); D1 = D1 ^ F(D2, k2); D2 = D2^ F(Dl, k3); Dl = Dl^ F(D2, k4); D2 = D2^ F(Dl, k5); Dl = Dl^ F(D2, k6); D1 = FL(D1, ke1); // FL D2 = FLINV(D2, ke2); // FLINV D2 = D2^ F(Dl, k7); Dl = Dl^ F(D2, k8); D2 = D2^ F(Dl, k9); D1 = D1 ^ F(D2, k10); D2 = D2^ F(Dl, kll); D1 = D1 ^ F(D2, k12); D1 = FL(D1, ke3); // FL D2 = FLINV(D2, ke4); // FLINV D2 = D2^ F(Dl, k13); Dl = Dl^ F(D2, k14); D2 = D2^ F(Dl, k15); Dl = Dl^ F(D2, k16); D2 = D2^ F(Dl, k17); Dl = Dl^ F(D2, k18); D2 = D2^kw3; // Konečné bělení D1=D1^kw4; C = (D2 << 64) | D1; |
192 a 256 bitů
Dl = M> 64; // Šifrovaná zpráva je rozdělena na dvě 64bitové části D2=M&MASK64; D1 = D1^kw1; // Předbělení D2 = D2^kw2; D2 = D2^ F(D1, k1); D1 = D1 ^ F(D2, k2); D2 = D2^ F(Dl, k3); Dl = Dl^ F(D2, k4); D2 = D2^ F(Dl, k5); Dl = Dl^ F(D2, k6); D1 = FL(D1, ke1); // FL D2 = FLINV(D2, ke2); // FLINV D2 = D2^ F(Dl, k7); Dl = Dl^ F(D2, k8); D2 = D2^ F(Dl, k9); D1 = D1 ^ F(D2, k10); D2 = D2^ F(Dl, kll); D1 = D1 ^ F(D2, k12); D1 = FL(D1, ke3); // FL D2 = FLINV(D2, ke4); // FLINV D2 = D2^ F(Dl, k13); Dl = Dl^ F(D2, k14); D2 = D2^ F(Dl, k15); Dl = Dl^ F(D2, k16); D2 = D2^ F(Dl, k17); Dl = Dl^ F(D2, k18); D1 = FL(D1, ke5); // FL D2 = FLINV(D2, ke6); // FLINV D2 = D2^ F(Dl, k19); Dl = Dl^ F(D2, k20); D2 = D2^ F(Dl, k21); Dl = Dl^ F(D2, k22); D2 = D2^ F(Dl, k23); Dl = Dl^ F(D2, k24); D2 = D2^kw3; // Konečné bělení D1=D1^kw4; C = (D2 << 64) | D1; |
Funkce F, FL a FLINV přijímají 2 64bitové parametry jako vstup - data F_IN a klíč KE.
Funkce F používá 16 8bitových proměnných t1, ..., t8, y1, ..., y8 a 1 64bitovou proměnnou. Výstupem funkce je 64bitové číslo.
Funkce FL a FLINV používají 4 32bitové proměnné x1,x2,k1,k2. Výstupem funkce je 64bitové číslo. Funkce FLINV - inverzní k FL
F funkce
x = F_IN^KE; ti = 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; ti = 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; |
Funkce FL
var x1, x2 jako 32bitové celé číslo bez znaménka; var k1, k2 jako 32bitové celé číslo bez znaménka; 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; |
Funkce FLINV
var y1, y2 jako 32bitové celé číslo bez znaménka; var k1, k2 jako 32bitové celé číslo bez znaménka; y1 = FLINV_IN >> 32; y2 = FLINV_IN&MASK32; k1 = KE >> 32; k2=KE&MASK32; y1 = y1^(y2|k2); y2 = y2 ^ ((y1 & k1) <<< 1); FLINV_OUT = (y1 << 32) | y2; |
Hodnota funkce SBOX1 je určena z následující tabulky:
0 | jeden | 2 | 3 | čtyři | 5 | 6 | 7 | osm | 9 | A | b | C | d | E | F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 112 | 130 | 44 | 236 | 179 | 39 | 192 | 229 | 228 | 133 | 87 | 53 | 234 | 12 | 174 | 65 |
jeden | 35 | 239 | 107 | 147 | 69 | 25 | 165 | 33 | 237 | čtrnáct | 79 | 78 | 29 | 101 | 146 | 189 |
2 | 134 | 184 | 175 | 143 | 124 | 235 | 31 | 206 | 62 | 48 | 220 | 95 | 94 | 197 | jedenáct | 26 |
3 | 166 | 225 | 57 | 202 | 213 | 71 | 93 | 61 | 217 | jeden | 90 | 214 | 81 | 86 | 108 | 77 |
čtyři | 139 | 13 | 154 | 102 | 251 | 204 | 176 | 45 | 116 | osmnáct | 43 | 32 | 240 | 177 | 132 | 153 |
5 | 223 | 76 | 203 | 194 | 52 | 126 | 118 | 5 | 109 | 183 | 169 | 49 | 209 | 23 | čtyři | 215 |
6 | dvacet | 88 | 58 | 97 | 222 | 27 | 17 | 28 | padesáti | patnáct | 156 | 22 | 83 | 24 | 242 | 34 |
7 | 254 | 68 | 207 | 178 | 195 | 181 | 122 | 145 | 36 | osm | 232 | 168 | 96 | 252 | 105 | 80 |
osm | 170 | 208 | 160 | 125 | 161 | 137 | 98 | 151 | 84 | 91 | třicet | 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 | deset | 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 |
Například: SBOX1(0x7a)=232.
SBOX2, SBOX3 a SBOX4 jsou definovány z SBOX1 takto:
Algoritmus dešifrování je totožný s šifrováním, pouze s tím rozdílem, že pomocné klíče jsou prohozeny podle následujícího schématu v závislosti na délce původního klíče:
Velikost klíče | |
---|---|
128 bit | 192 nebo 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 |
Klíč: 0123456789abcdeffedcba9876543210
Šifrovaná zpráva: 0123456789abcdefeffedcba9876543210
Šifrovaná zpráva: 67673138549669730857065648eabe43
Klíče
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 |
Podle autorů algoritmu:
Ukázali jsme, že úspěch diferenciální [2] a lineární [3] kryptoanalýzy je téměř nemožný proti plnému 18-kolovému cyklu Camellia. Camellia byla navíc navržena tak, aby odolala sofistikovanějším kryptografickým útokům, jako jsou diferenciální útoky vyššího řádu [4] [5] , interpolační útoky [6] [7] , útoky "linked-key" [8] [9] , zkrácené diferenciální útoky [10] [11] a další
Původní text (anglicky)[ zobrazitskrýt] Potvrdili jsme, že je extrémně nepravděpodobné, že by diferenciální a lineární útoky uspěly proti celé 18kolové Camellii. Kromě toho byla Camellia navržena tak, aby nabízela zabezpečení proti dalším pokročilým kryptoanalytickým útokům včetně diferenciálních útoků vyššího řádu, interpolačních útoků, útoků souvisejících klíčů, zkrácených diferenciálních útoků atd.Podpora pro Camellia byla přidána do finální verze Mozilla Firefox 3 v roce 2008 [12] . Později téhož roku vývojový tým FreeBSD oznámil, že podpora pro toto šifrování byla také zahrnuta do FreeBSD 6.4-RELEASE. V září 2009 GNU Privacy Guard přidal podporu pro Camellia ve verzi 1.4.10. Kromě toho mnoho populárních bezpečnostních knihoven, jako je Crypto++, GnuTLS, PolarSSL a OpenSSL [13] , také obsahuje podporu pro Camellia.
Algoritmus | Počet logických prvků | Doba výpočtu klíče, ns | Doba šifrování/dešifrování, ns | Šířka pásma, Mb/s | ||
---|---|---|---|---|---|---|
Šifrování/dešifrování | Klíče | Celkové množství | ||||
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 |
Had | 298,533 | 205,096 | 503,770 | 114,07 | 137,40 | 931,58 |
Dvě ryby | 200,165 | 231,682 | 431,857 | 16,38 | 324,80 | 394,08 |
Kamélie | 216,911 | 55,907 | 272,819 | 24,36 | 109,35 | 1170,55 |
Symetrické kryptosystémy | |
---|---|
Streamové šifry | |
Síť Feistel | |
Síť SP | |
jiný |