Camellia (algoritmus)

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 .

Leírás

Segédkulcs generálás

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
1. A (K) kulcs két 128 bites KL és KR részre van osztva.
Kulcs KL KR
128 K 0
192 K >> 64 ((K & MASK64) << 64) | (~(K&MASK64))
256 K >> 128 K&MASZK128
2. Számítsa ki a 128 bites KA és KB számokat (lásd az ábrát). A D1 és D2 változók 64 bitesek. D1 = (KL ^ KR) >> 64; D2=(KL^KR)&MASK64; D2=D2^F(D1,C1); D1 = D1^ F(D2, C2); D1=D1^(KL>>64); D2=D2^(KL&MASK64); D2 = D2^ F(D1, C3); D1 = D1^ F(D2, C4); KA = (D1 << 64) | D2; D1 = (KA ^ KR) >> 64; D2=(KA^KR)&MASK64; D2 = D2^ F(D1, C5); D1 = D1^ F(D2, C6); KB = (D1 << 64) | D2; 3. Számítsa ki a kw1, ..., kw4, k1, ..., k24, ke1, ..., ke6 kiegészítő 64 bites kulcsokat a kulcs méretétől függően:
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;

Titkosítás

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;

Segítő funkciók F, FL, FLINV

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;

S-blokkok

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:

SBOX2[x] = SBOX1[x] <<< 1; SBOX3[x] = SBOX1[x] <<< 7; SBOX4[x] = SBOX1[x <<< 1];

Dekódolás

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



Titkosítási példa

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

Biztonság

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.

Alkalmazás

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.

Összehasonlítás társaival

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

[tizennégy]

Fejlesztők

Lásd még

Jegyzetek

  1. 1036765. hiba – Tiltsa le azokat a rejtjelkészleteket, amelyek nem szerepelnek a „Browser Cipher Suite” javaslatban, és még mindig engedélyezve vannak . Letöltve: 2015. szeptember 18. Az eredetiből archiválva : 2018. február 3..
  2. M. Matsui , Lineáris kriptoanalízis módszere DES titkosításhoz – Előadási jegyzetek a számítástechnikában, 386–397. o., Springer-Verlag, 1994
  3. E. Biham és A. Shamir , Lineáris kriptoanalízis módszere DES titkosításhoz – Az adattitkosítási szabvány differenciális kriptoanalízise, ​​Springer-Verlag, 1994
  4. LRKnudsen , „Truncated and Higher Order Differentials”, Fast Software Encryption – Second International Workshop, Lecture Notes in ComputerScience 1008, pp.196–211, Springer-Verlag, 1995.
  5. T. Jakobsen és LR Knudsen , The Interpolation Attack on Block Ciphers, Fast Software Encryption, FSE'97, Lecture Notes in Computer Science 1267, pp.28–40, Springer-Verlag, 1997.
  6. T. Jakobsen és LR Knudsen , The Interpolation Attack on Block Ciphers, Fast Software Encryption, FSE'97, Lecture Notes in Computer Science 1267, pp.28–40, Springer-Verlag, 1997.
  7. K. Aoki , „Practical Evaluation of Security against Generalised Interpolation Attack”, IEICE Transactions on Fundamentals of Electronics, Communication and Computer Sciences (Japán), Vol. E83-A, No.1, pp.33–38, 2000.
  8. E. Biham , New Types of Cryptanalytic Attacks Using Related Keys, Journal of Cryptology, Vol.7, No.4, pp.229–246, Springer-Verlag, 1994.
  9. J.Kelsey, B.Schneier és D.Wagner , „Key-Schedule Cryptanalysis of IDEA, G-DES, GOST, SAFER, and Triple-DES”, Advances in Cryptology - CRYPTO'96, Lecture Notes in Computer Science 1109, pp.237–251, Springer-Verlag, 1996.
  10. LRKnudsen , Csonka és magasabb rendű különbségek, Gyors szoftvertitkosítás – Második nemzetközi műhely, Számítástechnikai előadásjegyzetek 1008, 196–211. o., Springer-Verlag, 1995.
  11. M. Matsui és T. Tokita , Az E2 blokkrejtjel csökkentett verziójának kriptoanalízise, ​​Fast Software Encryption - 6. International Workshop, FSE'99, Lecture Notes in Computer Science 1636, 71–80. oldal, Springer-Verlag, 1999 .
  12. Camellia titkosítás hozzáadva a Firefoxhoz (lefelé mutató link) . Mozilla Ázsia . Mozilla (2009. július 30.). Az eredetiből archiválva : 2012. február 29. 
  13. NTT (2006-11-08). A nyílt forráskódú közösségi OpenSSL projekt átveszi a Japánban kifejlesztett következő generációs nemzetközi szabványos „Camellia” titkosítót . Sajtóközlemény . Az eredetiből archiválva : 2008. március 8. Letöltve: 2008-02-29 .
  14. Kazumaro Aoki, Tetsuya Ichikawa, Masayuki Kanda, Mitsuru Matsui, Shiho Moriai, Junko Nakajima és Toshio Tokita Camellia: 128 bites blokkrejtjel, amely több platformon is használható – tervezés és elemzés

Linkek