Camellia | |
---|---|
Luoja | Mitsubishi |
Luotu | 2000 |
julkaistu | 2000 |
Avaimen koko | 128, 192 tai 256 bittiä |
Lohkon koko | 128 bittinen |
Kierrosten lukumäärä | 18 tai 24 |
Tyyppi | Feistelin verkko |
Camellia on japanilaisten Nippon Telegraphin ja Telephone Corporationin kehittämä symmetrinen lohkosalausalgoritmi ( lohkokoko 128 bittiä, avain 128, 192, 256 bittiä ), yksi eurooppalaisen NESSIE-kilpailun finalisteista ( yhdessä AES :n ja Shacal-2 :n kanssa). ja Mitsubishi Electric Corporation (toimitettu 10. maaliskuuta 2000 ). Japanilaisen CRYPTREC -järjestön sertifioima algoritmi, jota suositellaan teollisuuden ja valtion käyttöön.
Camellia on E2 -salausalgoritmin jatkokehitys , yksi AES -kilpailuun lähetetyistä algoritmeista ja jossa käytetään MISTY1- algoritmin elementtejä .
Algoritmin rakenne perustuu klassiseen Feistel-ketjuun, jossa on esi- ja loppuvalkaisu . Silmukkafunktio käyttää epälineaarista muunnosa (S-laatikot), lineaarista sirontalohkoa 16 jakson välein (tavuittain XOR -operaatio ) ja tavupermutaatiota.
Avaimen pituudesta riippuen siinä on 18 jaksoa (128-bittinen avain) tai 24 jaksoa (192- ja 256-bittinen avain).
Camellia-algoritmin tuki otettiin käyttöön vuonna 2008 Mozilla Firefox 3 :ssa, mutta se poistettiin käytöstä vuonna 2014 Mozilla Firefox 33:ssa [1] . Algoritmi on patentoitu, mutta sitä jaetaan useilla ilmaisilla lisensseillä, erityisesti se on osa OpenSSL -projektia .
Nimitys | Merkitys |
---|---|
& | Bitittain JA (JA) |
| | Bittikohtainen TAI (OR) |
^ | Bittikohtaisesti poissulkeva TAI (XOR) |
<< | Looginen siirto vasemmalle |
>> | Looginen siirto oikealle |
<<< | Käänny vasemmalle |
~y | Inversio |
Jatkuva | Merkitys |
---|---|
MASKIA8 | 0xff |
MASKKI32 | 0xffffffff |
MASKIA64 | 0xffffffffffffffffff |
MASKIO 128 | 0xffffffffffffffffffffffffffffffff |
C1 | 0xA09E667F3BCC908B |
C2 | 0xB67AE8584CAA73B2 |
C3 | 0xC6EF372FE94F82BE |
C4 | 0x54FF53A5F1D36F1C |
C5 | 0x10E527FADE682D1D |
C6 | 0xB05688C2B3E6C1FD |
Avain | KL | KR |
---|---|---|
128 | K | 0 |
192 | K >> 64 | ((K & MASK64) << 64) | (~(K&MASK64)) |
256 | K >> 128 | K&MASK128 |
128 bittinen
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 ja 256 bittiä
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; |
Salaus tapahtuu Feistelin kaavan mukaan, jossa 128-bittiselle avaimelle on 18 vaihetta ja 192- ja 256-bittisille avaimille 24 vaihetta. FL- ja FLINV-toiminnot otetaan käyttöön 6 askeleen välein.
128 bittinen
D1 = M >> 64; // Salattu viesti on jaettu kahteen 64-bittiseen osaan D2=M&MASK64; D1 = D1^kw1; // Esivalkaisu 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, 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; // Lopullinen valkaisu D1 = D1^kw4; C = (D2 << 64) | D1; |
192 ja 256 bittiä
D1 = M >> 64; // Salattu viesti on jaettu kahteen 64-bittiseen osaan D2=M&MASK64; D1 = D1^kw1; // Esivalkaisu 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, 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; // Lopullinen valkaisu D1 = D1^kw4; C = (D2 << 64) | D1; |
F-, FL- ja FLINV-funktiot vastaanottavat 2 64-bittistä parametria syötteenä - F_IN data ja KE-avain.
F-funktio käyttää 16 8-bittistä muuttujaa t1, ..., t8, y1, ..., y8 ja 1 64-bittinen muuttuja. Toiminnon tulos on 64-bittinen luku.
FL- ja FLINV-funktiot käyttävät 4 32-bittistä muuttujaa x1,x2,k1,k2. Toiminnon tulos on 64-bittinen luku. FLINV-toiminto - käänteinen FL:lle
F-toiminto
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-toiminto
var x1, x2 32-bittisenä etumerkittömänä kokonaislukuna; var k1, k2 32-bittisenä etumerkittömänä kokonaislukuna; 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-toiminto
var y1, y2 32-bittisenä etumerkittömänä kokonaislukuna; var k1, k2 32-bittisenä etumerkittömänä kokonaislukuna; 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; |
SBOX1-funktion arvo määritetään seuraavasta taulukosta:
0 | yksi | 2 | 3 | neljä | 5 | 6 | 7 | kahdeksan | 9 | a | b | c | d | e | f | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 112 | 130 | 44 | 236 | 179 | 39 | 192 | 229 | 228 | 133 | 87 | 53 | 234 | 12 | 174 | 65 |
yksi | 35 | 239 | 107 | 147 | 69 | 25 | 165 | 33 | 237 | neljätoista | 79 | 78 | 29 | 101 | 146 | 189 |
2 | 134 | 184 | 175 | 143 | 124 | 235 | 31 | 206 | 62 | 48 | 220 | 95 | 94 | 197 | yksitoista | 26 |
3 | 166 | 225 | 57 | 202 | 213 | 71 | 93 | 61 | 217 | yksi | 90 | 214 | 81 | 86 | 108 | 77 |
neljä | 139 | 13 | 154 | 102 | 251 | 204 | 176 | 45 | 116 | kahdeksantoista | 43 | 32 | 240 | 177 | 132 | 153 |
5 | 223 | 76 | 203 | 194 | 52 | 126 | 118 | 5 | 109 | 183 | 169 | 49 | 209 | 23 | neljä | 215 |
6 | kaksikymmentä | 88 | 58 | 97 | 222 | 27 | 17 | 28 | viisikymmentä | viisitoista | 156 | 22 | 83 | 24 | 242 | 34 |
7 | 254 | 68 | 207 | 178 | 195 | 181 | 122 | 145 | 36 | kahdeksan | 232 | 168 | 96 | 252 | 105 | 80 |
kahdeksan | 170 | 208 | 160 | 125 | 161 | 137 | 98 | 151 | 84 | 91 | kolmekymmentä | 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 | kymmenen | 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 |
Esimerkki: SBOX1(0x7a)=232.
SBOX2, SBOX3 ja SBOX4 määritellään SBOX1:stä seuraavasti:
Salauksen purkualgoritmi on identtinen salauksen kanssa sillä ainoalla erolla, että apuavaimet vaihdetaan seuraavan kaavan mukaan alkuperäisen avaimen pituudesta riippuen:
Avaimen koko | |
---|---|
128 bittinen | 192 tai 256 bittiä |
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 |
Avain: 0123456789abcdeffedcba9876543210
Salattu viesti: 0123456789abcdefeffedcba9876543210
Salattu viesti: 67673138549669730857065648eabe43
Avaimet
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 |
Algoritmin tekijöiden mukaan:
Olemme osoittaneet, että differentiaalisen [2] ja lineaarisen [3] kryptaanalyysin onnistuminen on lähes mahdotonta täyttä 18-kierrosta Camellia-sykliä vastaan. Lisäksi Camellia on suunniteltu kestämään kehittyneempiä kryptografisia hyökkäyksiä, kuten korkealuokkaisia differentiaalihyökkäyksiä [4] [5] , interpolaatiohyökkäyksiä [6] [7] , "linked-key" -hyökkäyksiä [8] [9] , lyhennettyjä differentiaalihyökkäyksiä. [10] [11] ja muut
Alkuperäinen teksti (englanniksi)[ näytäpiilottaa] Vahvistimme, että on erittäin epätodennäköistä, että differentiaaliset ja lineaariset hyökkäykset onnistuvat täyttä 18-kierrosta Camelliaa vastaan. Lisäksi Camellia on suunniteltu tarjoamaan suojaus muita edistyneitä kryptanalyyttisiä hyökkäyksiä vastaan, mukaan lukien korkeamman asteen differentiaalihyökkäykset, interpolaatiohyökkäykset, toisiinsa liittyvien avainten hyökkäykset, katkaistu differentiaalihyökkäykset ja niin edelleen.Camellia-tuki lisättiin Mozilla Firefox 3:n lopulliseen versioon vuonna 2008 [12] . Myöhemmin samana vuonna FreeBSD:n kehitystiimi ilmoitti, että myös FreeBSD 6.4-RELEASE sisältää tuen tälle salaukselle. Syyskuussa 2009 GNU Privacy Guard lisäsi tuen Camellialle versioon 1.4.10. Lisäksi monet suositut tietoturvakirjastot, kuten Crypto++, GnuTLS, PolarSSL ja OpenSSL [13] , sisältävät myös tuen Camellialle.
Algoritmi | Logiikkaelementtien lukumäärä | Avaimen laskentaaika, ns | Salaus/salauksen purkuaika, ns | Kaistanleveys, Mb/s | ||
---|---|---|---|---|---|---|
Salaus/salauksen purku | Avaimet | Kokonaismäärä | ||||
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äärme | 298,533 | 205.096 | 503,770 | 114.07 | 137,40 | 931,58 |
Kaksi kalaa | 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 |
Symmetriset salausjärjestelmät | |
---|---|
Suoratoista salauksia | |
Feistelin verkko | |
SP verkko | |
Muut |