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 KAKB wykorzystuje się sześć pomocniczych stałych oznaczanych jako ∑i.

Na podstawie czterech 128-bitowych zmiennych KL, KR, KAKB 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 dla klucza o długości 128 bitów

Schemat Blokowy Szyfrowania w Camellia dla 192 lub 256-bitowego klucza

Schemat blokowy szyfrowania dla klucza o długości 192 lub 256 bitów

Schemat Blokowy Deszyfrowania w Camellia dla 128-bitowego klucza

Schemat blokowy deszyfrowania dla klucza o długości 128 bitów

Schemat Blokowy Deszyfrowania w Camellia dla 192 lub 256-bitowego klucza

Schemat blokowy deszyfrowania dla klucza o długości 192 lub 256 bitów

Schemat Blokowy Bloku Sześciu Rund w Camellia

Schemat bloku sześciu rund

Schemat Blokowy Tworzenia Zmiennych Pomocniczych Klucza w Camellia

Schemat blokowy tworzenia zmiennych Ka i Kb

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:

11213044236179 3919222922813387532341217465
3523910714769251653323714797829101146189
13418417514312423531206624822095941971126
16622557202213719361217 190214818610877
1391315410225120417645116184332240177132153
2237620319452126118 51091831694920923 4215
20885897222271728501515622832424234
2546820717819518112214536 82321689625210580
17020816012516113798151849130149224255100210
16196 072163247117219138 3230218 963221148
13592131 22057414451115103246243157127191226
8215521638200551985912915011175191909946
233121167140159110188142412452491824725318089
120152 6106231701131862123717166136162141250
114 718585248238172105473421046056241164
64402111231872016719321227173244119199128158

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, KAKB 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 KLna początku
kw264 prawe bity KLna początku
k164 lewe bity KAF (runda 1)
k264 prawe bity KAF (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 KLna początku
kw264 prawe bity KLna początku
k1 64 lewe bity KBF (runda 1)
k2 64 prawe bity KBF (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