Camellia
- Długość bloku = 128 bitów
- Długość klucza = 128, 192 lub 256 bitów
Szyfr został opracowany w Japonii przez firmy Mitsubishi i NTT w roku 2000. Jest zatwierdzony jako skuteczny i bezpieczny algorytm szyfrujący przez wiele organizacji na całym świecie, między innymi Międzynarodową Organizację Normalizacyjną (ang. International Organization for Standardization - ISO), projekt badawczy UE NESSIE oraz japoński CRYPTREC.
Zastosowanie
Camellia został zaprojektowany dla efektywnego działania w rozwiązaniach programistycznych i sprzętowych. Jest używana w wielu różnych sytuacjach od tanich kart elektronicznych do wydajnych protokołów sieciowych.
Algorytm
Camellia jest szyfrem blokowym z kluczem symetrycznym o długości 128, 192 lub 256 bitów. Wielkości bloków tekstu jawnego i szyfrogramu są takie same i wynoszą zawsze 128 bitów.
W opisie szyfru zachowano oryginalne nazewnictwo wszystkich wykorzystywanych zmiennych, bazując na oficjalnej dokumentacji Camellia.
Najważniejszymi elementami algorytmu są funkcje F, które wykorzystywane są podczas szyfrowania, deszyfrowania i manipulacji zmiennymi pomocniczymi klucza. Funkcja F pobiera 128 bitów wejściowych, miesza je z bitami podkluczy ki i zwraca 128 nowych bitów. Przekształcenie bitów w funkcji F nazywane jest rundą algorytmu. Wywołania funkcji F zebrane są w bloki zawierające sześć kolejnych powtórzeń takich rund.
Bloki sześciu rund (czyli sześciu wywołań funkcji F) oddzielone są wywołaniami funkcji FL oraz FL-1. Manipulują one 64-bitowymi partiami danych, mieszając je z podkluczami kli.
Algorytmy szyfrowania i deszyfrowania polegają na wykonaniu pewnej liczby powtórzeń opisanych wyżej bloków sześciu rund (wywołań funkcji F). Ilość powtórzeń tych bloków zależy od długości używanego sekretnego klucza szyfrującego:
- 3 powtórzenia bloków sześciu rund - dla klucza o długości 128 bitów,
- 4 powtórzenia bloków sześciu rund - dla kluczy o długości 192 lub 256 bitów.
Dodatkowo, na początku i na końcu działania algorytmów szyfrującego i deszyfrującego wykonywane są dodatkowe operacje sumowania z bitami podkluczy kwi.
Podklucze wykorzystywane do zaszyfrowania każdego bloku danych (lub odczytania każdego bloku szyfrogramu) tworzone są w oddzielnym procesie. Dla każdego bloku danych, z sekretnego klucza tworzonych jest wiele podkluczy, wykorzystywanych potem w różnych miejscach głównego algorytmu.
Tworzenie podkluczy
Sekretny klucz używany w szyfrze Camellia może składać się ze 128, 192 lub 256 bitów. W celu zaszyfrowania każdego bloku danych, z bitów klucza tworzonych jest szereg zmiennych pomocniczych, a następnie podkluczy, z których każdy ma długość 64 bitów.
W pierwszej kolejności tworzone są dwie zmienne o długości 128 bitów (KL oraz KR) oraz cztery zmienne o długości 64 bitów (KLL, KLR, KRL oraz KRR). Zmienne te związane są pomiędzy sobą następującymi zależnościami:
- KLL = lewe 64 bity KL
- KLR = prawe 64 bity KL
- KRL = lewe 64 bity KR
- KRR = prawe 64 bity KR
Pozostałe zależności należy wybrać bazując na używanej długości sekretnego klucza K.
- dla sekretnego klucza K o długości 128 bitów:
- KL = K
- KR = 0
- dla sekretnego klucza K o długości 192 bitów:
- KL = lewe 128 bitów K
- KRL = prawe 64 bity K
- KRR = ~KRL (negacja bitów)
- dla sekretnego klucza K o długości 256 bitów:
- KL = lewe 128 bitów K
- KR = prawe 128 bitów K
Na podstawie tych zmiennych generuje się dwie kolejne zmienne pomocnicze: KA oraz KB. Każda z nich składa się ze 128 bitów. Zmienna KB jest różna od zera wtedy i tylko wtedy, gdy wykorzystywany sekretny klucz ma 192 lub 256 bitów. W procesie tworzenia zmiennych KA i KB wykorzystuje się sześć pomocniczych stałych oznaczanych jako ∑i.
Na podstawie czterech 128-bitowych zmiennych KL, KR, KA i KB wyliczane są wszystkie sekretne 64-bitowe podklucze: ki, kwi oraz kli. Podklucze wykorzystywane są we wszystkich etapach szyfrowania i deszyfrowania w algorytmie Camellia.
Schemat Blokowy Szyfrowania w Camellia dla 128-bitowego klucza
Schemat Blokowy Szyfrowania w Camellia dla 192 lub 256-bitowego klucza
Schemat Blokowy Deszyfrowania w Camellia dla 128-bitowego klucza
Schemat Blokowy Deszyfrowania w Camellia dla 192 lub 256-bitowego klucza
Schemat Blokowy Bloku Sześciu Rund w Camellia
Schemat Blokowy Tworzenia Zmiennych Pomocniczych Klucza w Camellia
Matematyka:
Camellia wykorzystuje zestaw podstawowych operacji na bitach używanych w komputerach: iloczyn bitowy AND, sumę bitową OR, operację sumowania XOR, negację bitów w zmiennej oraz przesunięcie bitów w lewo o podaną liczbę pozycji <<< n (bity ze skrajnie lewych pozycji przechodzą na wolne skrajnie prawe pozycje w zmiennej).
Poza tymi podstawowymi działaniami, zdefiniowane są bardziej złożone funkcje, z których składają się algorytmy szyfrujący i deszyfrujący oraz algorytm tworzenia podkluczy.
Funkcja S
Funkcja S jest wykorzystywana przez funkcję F. Dane wejściowe o długości 64 bitów są podmieniane na inne 8 bajtów, zwracane następnie do dalszego przetwarzania.
Funkcja wykorzystuje w swoim działaniu 4 tablice podstawieniowe, nazywane blokami S (ang. s-box).
Dane wejściowe dzielone są na osiem oddzielnych bajtów x1,...,x8, z których x1 zawiera najbardziej skrajne osiem bitów, x2 kolejne osiem bitów, a x8 ostatnie skrajne osiem prawych bitów.
Każdy z bloków S podmienia osiem otrzymanych bitów na osiem innych bitów wskazanych w tabeli. Bloki S oznaczone są jako s1,...,s4. Oznaczając przez y1,...,y8 osiem klejnych bajtów wyjściowych z funkcji (bajt y1 zawiera najbardziej lewe bity wyjściowe, natomiast bajt y8 zawiera najbardziej prawe bity wyjściowe), można przedstawić przekształcenia dokonywane w funkcji S jako:
y1 = s1(x1)
y2 = s2(x2)
y3 = s3(x3)
y4 = s4(x4)
y5 = s2(x5)
y6 = s3(x6)
y7 = s4(x7)
y8 = s1(x8)
Blok s1 zawiera 256 następjących wartości:
112 | 130 | 44 | 236 | 179 | 39 | 192 | 229 | 228 | 133 | 87 | 53 | 234 | 12 | 174 | 65 |
35 | 239 | 107 | 147 | 69 | 25 | 165 | 33 | 237 | 14 | 79 | 78 | 29 | 101 | 146 | 189 |
134 | 184 | 175 | 143 | 124 | 235 | 31 | 206 | 62 | 48 | 220 | 95 | 94 | 197 | 11 | 26 |
166 | 225 | 57 | 202 | 213 | 71 | 93 | 61 | 217 | 1 | 90 | 214 | 81 | 86 | 108 | 77 |
139 | 13 | 154 | 102 | 251 | 204 | 176 | 45 | 116 | 18 | 43 | 32 | 240 | 177 | 132 | 153 |
223 | 76 | 203 | 194 | 52 | 126 | 118 | 5 | 109 | 183 | 169 | 49 | 209 | 23 | 4 | 215 |
20 | 88 | 58 | 97 | 222 | 27 | 17 | 28 | 50 | 15 | 156 | 22 | 83 | 24 | 242 | 34 |
254 | 68 | 207 | 178 | 195 | 181 | 122 | 145 | 36 | 8 | 232 | 168 | 96 | 252 | 105 | 80 |
170 | 208 | 160 | 125 | 161 | 137 | 98 | 151 | 84 | 91 | 30 | 149 | 224 | 255 | 100 | 210 |
16 | 196 | 0 | 72 | 163 | 247 | 117 | 219 | 138 | 3 | 230 | 218 | 9 | 63 | 221 | 148 |
135 | 92 | 131 | 2 | 205 | 74 | 144 | 51 | 115 | 103 | 246 | 243 | 157 | 127 | 191 | 226 |
82 | 155 | 216 | 38 | 200 | 55 | 198 | 59 | 129 | 150 | 111 | 75 | 19 | 190 | 99 | 46 |
233 | 121 | 167 | 140 | 159 | 110 | 188 | 142 | 41 | 245 | 249 | 182 | 47 | 253 | 180 | 89 |
120 | 152 | 6 | 106 | 231 | 70 | 113 | 186 | 212 | 37 | 171 | 66 | 136 | 162 | 141 | 250 |
114 | 7 | 185 | 85 | 248 | 238 | 172 | 10 | 54 | 73 | 42 | 104 | 60 | 56 | 241 | 164 |
64 | 40 | 211 | 123 | 187 | 201 | 67 | 193 | 21 | 227 | 173 | 244 | 119 | 199 | 128 | 158 |
Bloki S zwracają wartości wskazane przez jednobajtową liczbę wejściową. Komórki w tabeli numerowane są liczbami od 0 do 255, od lewej do prawej strony oraz od góry do dołu. Przykładowo s1[0] wynosi 112, s1[1] równa się 130, natomiast s1[255] wynosi 158.
Pozostałe trzy bloki S mogą zostać zdefiniowane jako tablice zawierające 256 liczb, podobnie jak blok s1. Alternatywnie, można operacje na nich przedstawić jako działania na s1, ze zmienionymi danymi wejściowymi:
s2(x) := (s1(x) <<< 1)
s3(x) := (s1(x) >>> 1)
s4(x) := s1(x<<<1)
Funkcja P
Funkcja P jest wykorzystywana przez funkcję F. Funkcja P pobiera dane wejściowe o długości 8 bajtów (które są wyjściem z funkcji S), przekształca je i zwraca również wektor o długości 8 bajtów. Wyjście z funkcji P jest też wyjściem z funkcji F.
Dane wejściowe dzielone są na osiem oddzielnych bajtów x1,...,x8, z których x1 zawiera najbardziej skrajne osiem bitów, x2 kolejne osiem bitów, natomiast x8 ostatnie skrajne osiem prawych bitów.
Oznaczając osiem klejnych bajtów wyjściowych z funkcji jako y1,...,y8 (gdzie y1 zawiera najbardziej lewe osiem bitów wyjściowych, y2 kolejne osiem bitów, natomiast y8 zawiera skrajne prawe osiem bitów wyjściowych), można przedstawić przekształcenia dokonywane w funkcji P jako:
y1 = x1 XOR x3 XOR x4 XOR x6 XOR x7 XOR x8
y2 = x1 XOR x2 XOR x4 XOR x5 XOR x7 XOR x8
y3 = x1 XOR x2 XOR x3 XOR x5 XOR x6 XOR x8
y4 = x2 XOR x3 XOR x4 XOR x5 XOR x6 XOR x7
y5 = x1 XOR x2 XOR x6 XOR x7 XOR x8
y6 = x2 XOR x3 XOR x5 XOR x7 XOR x8
y7 = x3 XOR x4 XOR x5 XOR x6 XOR x8
y8 = x1 XOR x4 XOR x5 XOR x6 XOR x7
Funkcja F
Funkcja F jest jedną z głównych funkcji wykorzystywaną podczas szyfrowania i deszyfrowania danych oraz generowania podkluczy. Dane wejściowe (X) mają długość 64 bitów i są mieszane z jednym z podkluczy (k), również o długości 64 bitów. Funkcja zwraca 64 bity oznaczone jako Y.
Bity danych są dodawane XOR do bitów klucza, a następnie przekształcane przez dwie funkcje S oraz P.
(X, k) -> Y => P (S (X XOR k)) -> Y
Funkcja FL
Funkcja FL wykorzystywana jest podczas szyfrowania i deszyfrowania. Operuje na bloku danych o długości 64 bitów. Bity są mieszane z jednym z podkluczy i zwracany blok wyjściowy ma również długość 64 bitów.
Blok danych wejściowych jest oznaczony jako X, natomiast Y to 64 bity wyjściowe, a kl to bity utworzonego wcześniej podklucza:
(X, kl) -> Y => (XL || XR, klL || klR) -> YL || YR
W pierwszej kolejności X jest dzielone na dwie 32-bitowe połówki: XL zawiera 32 lewych bitów X, natomiast XR składa się z 32 prawych bitów X. Następnie wylicza dwa bloki, również o długości 32 bitów:
YR = ((XL AND klL) <<< 1) XOR XR
YL = (YR OR klR) XOR XL
YL stanowi 32 lewe bity wyjściowe z funkcji FL, natomiast YR to 32 prawe bity wyjściowe.
Funkcja FL-1
Funkcja FL-1 wykorzystywana jest podczas algorytmów szyfrowania i deszyfrowania. Operuje na bloku danych o długości 64 bitów, który mieszany jest z jednym z podkluczy. Zwracany blok wyjściowy ma również długość 64 bitów.
Blok danych wejściowych jest oznaczony jako Y, natomiast X to 64 bity wyjściowe, a kl to bity utworzonego wcześniej podklucza:
(Y, kl) -> X => (YL || YR, klL || klR) -> XL || XR
W pierwszej kolejności Y jest dzielone na dwie 32-bitowe połówki: YL zawiera 32 lewych bitów Y, natomiast YR składa się z 32 prawych bitów Y. Następnie wylicza dwa bloki, również o długości 32 bitów:
XL = (YR OR klR) XOR YL
XR = ((XL AND klL) <<< 1) XOR YR
XL stanowi 32 lewe bity wyjściowe z funkcji FL-1, natomiast XR to 32 prawe bity wyjściowe.
Stałe używane podczas generowania podkluczy
W trakcie generowania podkluczy w procesie szyfrowania i deszyfrowania kolejnych bloków używanych jest sześć stałych wartości, oznaczanych jako ∑i.
Poniższe wartości mają długości 64 bitów i są przedstawione w zapisie szesnastkowym.
∑1 = | 0xA09E667F3BCC908B |
∑2 = | 0xB67AE8584CAA73B2 |
∑3 = | 0xC6EF372FE94F82BE |
∑4 = | 0x54FF53A5F1D36F1C |
∑5 = | 0x10E527FADE682D1D |
∑6 = | 0xB05688C2B3E6C1FD |
Generowanie podkluczy
Na podstawie czterech 128-bitowych zmiennych KL, KR, KA i KB należy wyliczyć podklucze ki, kwi oraz kli, wszystkie o długości 64 bitów.
Tabela generowania podkluczy dla sekretnego klucza o długości 128 bitów:
podklucz | otrzymana wartość | gdzie użyty |
---|---|---|
kw1 | 64 lewe bity KL | na początku |
kw2 | 64 prawe bity KL | na początku |
k1 | 64 lewe bity KA | F (runda 1) |
k2 | 64 prawe bity KA | F (runda 2) |
k3 | 64 lewe bity (KL <<< 15) | F (runda 3) |
k4 | 64 prawe bity (KL <<< 15) | F (runda 4) |
k5 | 64 lewe bity (KA <<< 15) | F (runda 5) |
k6 | 64 prawe bity (KA <<< 15) | F (runda 6) |
kl1 | 64 lewe bity (KA <<< 30) | FL |
kl2 | 64 prawe bity (KA <<< 30) | FL-1 |
k7 | 64 lewe bity (KL <<< 45) | F (runda 7) |
k8 | 64 prawe bity (KL <<< 45) | F (runda 8) |
k9 | 64 lewe bity (KA <<< 45) | F (runda 9) |
k10 | 64 prawe bity (KL <<< 60) | F (runda 10) |
k12 | 64 lewe bity (KA <<< 60) | F (runda 11) |
k12 | 64 prawe bity (KL <<< 60) | F (runda 12) |
kl3 | 64 lewe bity (KL <<< 77) | FL |
kl4 | 64 prawe bity (KL <<< 77) | FL-1 |
k13 | 64 lewe bity (KL <<< 94) | F (runda 13) |
k14 | 64 prawe bity (KL <<< 94) | F (runda 14) |
k15 | 64 lewe bity (KA <<< 94) | F (runda 15) |
k16 | 64 prawe bity (KA <<< 94) | F (runda 16) |
k17 | 64 lewe bity (KL <<< 111) | F (runda 17) |
k18 | 64 prawe bity (KL <<< 111) | F (runda 18) |
kw3 | 64 lewe bity (KA <<< 111) | na końcu |
kw4 | 64 prawe bity (KA <<< 111) | na końcu |
Tabela generowania podkluczy dla sekretnych kluczy o długości 192 bitów lub 256 bitów:
podklucz | otrzymana wartość | gdzie użyty |
---|---|---|
kw1 | 64 lewe bity KL | na początku |
kw2 | 64 prawe bity KL | na początku |
k1 | 64 lewe bity KB | F (runda 1) |
k2 | 64 prawe bity KB | F (runda 2) |
k3 | 64 lewe bity (KR <<< 15) | F (runda 3) |
k4 | 64 prawe bity (KR <<< 15) | F (runda 4) |
k5 | 64 lewe bity (KA <<< 15) | F (runda 5) |
k6 | 64 prawe bity (KA <<< 15) | F (runda 6) |
kl1 | 64 lewe bity (KR <<< 30) | FL |
kl2 | 64 prawe bity (KR <<< 30) | FL-1 |
k7 | 64 lewe bity (KB <<< 30) | F (runda 7) |
k8 | 64 prawe bity (KB <<< 30) | F (runda 8) |
k9 | 64 lewe bity (KL <<< 45) | F (runda 9) |
k10 | 64 prawe bity (KL <<< 45) | F (runda 10) |
k12 | 64 lewe bity (KA <<< 45) | F (runda 11) |
k12 | 64 prawe bity (KA <<< 45) | F (runda 12) |
kl3 | 64 lewe bity (KL <<< 60) | FL |
kl4 | 64 prawe bity (KL <<< 60) | FL-1 |
k13 | 64 lewe bity (KR <<< 60) | F (runda 13) |
k14 | 64 prawe bity (KR <<< 60) | F (runda 14) |
k15 | 64 lewe bity (KB <<< 60) | F (runda 15) |
k16 | 64 prawe bity (KB <<< 60) | F (runda 16) |
k17 | 64 lewe bity (KL <<< 77) | F (runda 17) |
k18 | 64 prawe bity (KL <<< 77) | F (runda 18) |
kl5 | 64 lewe bity (KA <<< 77) | FL |
kl6 | 64 prawe bity (KA <<< 77) | FL-1 |
k19 | 64 lewe bity (KR <<< 94) | F (runda 19) |
k20 | 64 prawe bity (KR <<< 94) | F (runda 20) |
k21 | 64 lewe bity (KA <<< 94) | F (runda 21) |
k22 | 64 prawe bity (KA <<< 94) | F (runda 22) |
k23 | 64 lewe bity (KL <<< 111) | F (runda 23) |
k24 | 64 prawe bity (KL <<< 111) | F (runda 24) |
kw3 | 64 lewe bity (KB <<< 111) | na końcu |
kw4 | 64 prawe bity (KB <<< 111) | na końcu |
Implementacja
Na stronie korporacji NTT można znaleźć kody źródłowe i szczegółowe opisy szyfru Camellia:
info.isl.ntt.co.jp/crypt/eng/camellia