Truecrypt – Szczegóły techniczne

W tym dziale zapoznamy się ze szczegółami technicznymi programu TrueCrypt. Poruszymy następujące kwestie:

 

Znakowanie

C

Blok tekstu zaszyfrowanego

DK()

Algorytm deszyfrujący używający klucza szyfrującego/deszyfrującego K

EK()

Algorytm szyfrujący używający klucza szyfrującego/deszyfrującego K

H()

Funkcja haszująca

i

Indeks bloków dla bloków n-bit; n jest zależne od kontekstu

K

Klucz kryptograficzny

P

Blok zwykłego tekstu

GF

Pole Galoisa

^

Operacja bitwise exclusive-OR (XOR)

Dodawanie modułu 2n, gdzie n jest wielkością bitową znajdującego się po lewej argumentu i wielkością bitową wynikłej wartości (np. jeśli znajdujący się po lewej argument jest 1-bitową wartością, a drugi argument jest 2-bitową wartością to: 1⊕0 = 1; 1⊕1=0; 1⊕2 =1; 1⊕3=0; 0⊕0=0; 0⊕1=1; 0⊕2=0; 0⊕3=1)

Modułowe mnożenie dwóch wielomianów na polu binarnym GF(2), moduł x128+x7+x2+x+1

||

Powiązanie


Schemat szyfrowania
Gdy montujesz wolumen TrueCrypt (zakładając, że w pamięci nie ma zapisanych haseł/plików klucza) lub przeprowadzasz autoryzację przed rozruchem systemu, wykonywane są następujące czynności:

1. Pierwsze 512 bajtów wolumenu (tj. standardowego nagłówka wolumenu) są odczytywane w pamięci RAM i z czego 64 bajty to sól (patrz Specyfikacja formatu wolumenu TrueCrypt). Podczas szyfrowania systemu (patrz rozdział Szyfrowanie systemu), ostatnie 512 bajty pierwszej logicznej ścieżki dysku są odczytywane w RAM (program rozruchowy TrueCrypt Boot Loader jest przechowywany w pierwszej ścieżce dysku systemowego i/lub na Dysku ratunkowym TrueCrypt).

2. Bajty 65536–66047 wolumenu są odczytywane w RAM (patrz sekcja Specyfikacja formatu wolumenu TrueCrypt). Podczas szyfrowania systemu, bajty 65536–66047 pierwszej partycji poza aktywną partycją* są odczytywane w RAM (patrz sekcja Ukryty system operacji). Jeśli w tym wolumenie (lub na partycji innej niż aktywna) znajduje się ukryty wolumen, to jego nagłówek (lub przypadkowe dane) już odczytaliśmy (próba rozszyfrowania tych danych posłuży jako wskaźnik, czy w tym wolumenie znajduje się ukryty wolumen). Więcej informacji znajdziesz w sekcji Ukryty wolumen.

3. Teraz program TrueCrypt będzie próbować rozszyfrować standardowy nagłówek wolumenu odczytanego w punkcie (1). Wszystkie dane używane i wygenerowane podczas procesu deszyfrowania są przechowywanego w pamięci RAM (TrueCrypt nie zapisuje ich na dysk). Następujące parametry są nieznane** i muszą być ustalone metodą prób i błędów, tj. poprzez testowanie wszelkich możliwych kombinacji, jak poniżej:

a. Rodzina pseudolosowych funkcji, PRF, używana przez funkcję wyprowadzania klucza nagłówka (jak określone w PKCS #5 v2.0; zobacz sekcję Wyprowadzanie klucza nagłówka, sól (ciąg zaburzający) i liczba iteracji), i może być to jedna z podanych niżej: HMAC-SHA-512, HMAC-RIPEMD-160, HMAC-Whirlpool. Hasło podane przez użytkownika (do którego mogą być zastosowane jeden lub więcej plików-kluczy – patrz sekcja Pliki klucza) i sól odczytana w punkcie (1) są przekazane funkcji wyprowadzania klucza nagłówka, co z kolei tworzy ciąg wartości (patrz sekcja Wyprowadzanie klucza nagłówka, sól (ciąg zaburzający) i liczba iteracji), z których tworzone są klucz szyfrowania nagłówka i drugorzędny klucz nagłówka (tryb XTS). Klucze te używane są do deszyfrowania nagłówka wolumenu.

b. Algorytm szyfrowania: AES-256, Serpent, Twofish, AES-Serpent, AES-Twofish-Serpent, itd.

c. Tryb operacji: XTS, LRW (przestarzały/stara wersja), CBC (przestarzały/stara wersja)

d. Rozmiar(y) klucza

4. Deszyfrowanie zostaje ukończone pomyślnie, jeśli pierwsze 4 bajty zaszyfrowanych danych zawierają ciąg ASCII „TRUE” i jeśli suma kontrolna CRC-32 ostatnich 256 bajtów deszyfrowanych danych (nagłówka wolumenu) pasuje do wartości zlokalizowanej w bajcie #8 zaszyfrowanych danych (dla osoby obcej/potencjalnie wrogiej ta wartość pozostaje nieznana – jest zaszyfrowana, patrz sekcja Wyprowadzanie klucza nagłówka, sól (ciąg zaburzający) i liczba iteracji). Jeśli te warunki nie zostały spełnione, proces zostaje powtórzony od punktu (3), ale tym razem, zamiast danych odczytanych w punkcie (1), użyte zostają dane z punktu (2) (tj. możliwego nagłówka ukrytego wolumenu). Gdy te warunki też nie zostają spełnione, montowanie zostaje przerwane (niepoprawne hasło, uszkodzony wolumen, wolumen nie należący do programu TrueCrypt).

5. Teraz wiemy (lub przypuszczamy), że podane hasło i algorytm szyfrowania są poprawne i tak samo tryb, rozmiar klucza i algorytm wyprowadzania klucza nagłówka są prawidłowe. Jeśli ukończyliśmy deszyfrowanie danych odczytanych w punkcie (2), to wiemy też, że montujemy ukryty wolumen i że jego rozmiar jest odzyskiwany z danych odczytanych w punkcie (2) i deszyfrowanych w (3).

6. Proces szyfrowania jest inicjowany ponownie z użyciem podstawowego klucza głównego*** i klucza drugorzędnego (tryb XTS), które odzyskiwane są z nagłówka rozszyfrowanego wolumenu (patrz sekcja Specyfikacja formatu wolumenu TrueCrypt ). Klucze te mogą zostać użyte do rozszyfrowania każdego sektora wolumenu oprócz sektora nagłówku wolumenu (czy w przypadku szyfrowania systemu, sektora danych klucza), który został zaszyfrowany przy użyciu klucza nagłówka. Wolumen został zamontowany.

Zobacz też sekcję Tryby operacji, sekcję Wyprowadzanie klucza nagłówka, sól (ciąg zaburzający) i liczba iteracji i dział Model zabezpieczeń.

*Jeśli rozmiar aktywnej partycji jest mniejszy niż 256 MB, dane są odczytywane z drugiej partycji (kolejnej poza aktywną). Windows 7 i późniejsze wersje Windowsa domyślnie nie
przeprowadzają rozruchu z partycji na której zainstalowany jest system).

** Te parametry pozostaję tajne nie po to, by utrudnić atak, lecz po to, by uczynić wolumeny nieidentyfikowalnymi (nie do odróżnienia od przypadkowych danych), co byłoby trudne do zrobienia, gdyby parametry te były przechowywane niezaszyfrowane w nagłówku wolumenu. Pamiętaj też, że podczas szyfrowania systemu używany jest niekaskadowy algorytm szyfrowania. Algorytm ten jest znany (może być wyznaczony dzięki analizie zawartości niezaszyfrowanego programu TrueCrypt Boot Loader, który przechowywany jest w pierwszej logicznej ścieżce dysku lub na Dysku ratunkowym TrueCrypt).

*** Klucze główne zostały wygenerowane podczas tworzenia wolumenu i nie mogą zostać później zmieniane. Zmiana hasła do wolumenu następuje poprzez ponowne zaszyfrowanie nagłówka wolumenu przy użyciu nowego klucza nagłówka (wyprowadzonego z nowego hasła).


Tryby operacji

Trybem operacji używanym przez TrueCrypt dla zaszyfrowanych partycji, dysków i wirtualnych wolumenów jest tryb XTS.

Tryb ten jest w rzeczywistości lekko zmodyfikowanym trybem XEX oryginalnie zaprojektowanym w 2003 roku przez Phillipa Rogawaya. Tryb XEX używa jednego klucza do dwóch celów, a tryb XTS używa już dwóch osobnych kluczy.

W 2010 roku, tryb XTS został uznany przez NIST jako narzędzie do ochrony poufnych danych urządzeniach magazynujących dane [24]. W 2007 został także zaakceptowany przez IEEE do pełnienia ochrony danych kryptograficznych na urządzeniach przeznaczonych do przechowywania bloków danych. (IEEE 1619).

Opis trybu XTS:
Ci = EK1(Pi ^ (EK2(n) ⊗ αi)) ^ (EK2(n) αi)

Gdzie:

⊗ Oznacza pomnożenie dwóch wielomianów w polu binarnym GF(2) moduł x128+x7+x2+x+1

K1 jest kluczem szyfrowania (256 bitów na każdy obsługiwany szyfr, tj. AES, Serpent, and Twofish)

K2 jest kluczem drugorzędnym (256 bitów na każdy obsługiwany szyfr, tj. AES, Serpent, and Twofish)

i jest indeksem bloku szyfru w jednostce danych; dla pierwszego bloku szyfru w jednostce danych, i = 0

n jest indeksem jednostki danych w zakresie K1; dla pierwszej jednostki danych, n = 0

a jest podstawowym elementem GF(2128) wybranym na wielomian x (tj. 2)

Uwaga: Pozostałe symbole są wymienione w sekcji Znakowanie.

Rozmiar każdej jednostki danych zawsze wynosi 512 bajtów (niezależnie od rozmiaru sektora).

 


Wyprowadzanie klucza nagłówka, sól (ciąg zaburzający) i liczba iteracji

Klucz nagłówka jest używany zarówno do szyfrowania jak i deszyfrowania zaszyfrowanego sektora nagłówka wolumenu TrueCrypt (w przypadku szyfrowania system sektora danych klucza), który zawiera w sobie klucz główny i inne dane (zobacz sekcje Schemat szyfrowania i Specyfikacja formatu wolumenu TrueCrypt). W wolumenach (i w przypadku zaszyfrowanego systemu) utworzonych w wersji programu TrueCrypt 5.0 lub w późniejszych jego wersjach, sektor zaszyfrowany jest w trybie XTS (zobacz sekcję Tryby operacji). TrueCrypt używa metody PBKDF2 (opisanej w specified in PKCS #5 v2.0) do generowania klucza nagłówka i do drugorzędnego klucza nagłówka (w trybie XTS).

Używana jest 512-bitowa sól, co oznacza, że istnieje 2512 kluczy na każde hasło. To znacząco zmniejsza wrażliwość na ataki słownikowe „off-line‟ i ataki z użyciem „tęczowych tablic‟ (wstępne obliczanie wszystkich kluczy ze słownika haseł jest bardzo trudne gdy zastosowana jest sól). Sól złożona jest z losowych wartości wygenerowanych przez Generator losowych liczb TrueCrypt podczas tworzenia wolumenu. Funkcja wyprowadzania klucza nagłówka jest oparta na algorytmach HMAC-SHA-512, HMAC-RIPEMD-160, lub HMAC-Whirlpool – użytkownik wybiera o jaki algorytm ma być oparta funkcja. Długość wyprowadzonego klucza niezależny od rozmiaru wartości wyjściowej odpowiedniej funkcji haszującej. Na przykład, klucz nagłówka dla szyfru AES-256 będzie miał zawsze długość 256 bitów, nawet gdy użyta jest funkcja HMAC-RIPEMD-160 (w trybie XTS używany jest dodatkowy, 256-bitowy, drugorzędny klucz nagłówka; więc daje to w sumie dwa 256-bitowe klucze dla szyfrowania AES-256). Aby wyprowadzić klucz nagłówka, musi być wykonanych 1000 iteracji funkcji wyprowadzania klucza (lub 2000 iteracji w przypadku użycia HMAC-RIPEMD-160 jako odpowiedniej funkcji haszującej), co wydłuża proces dokładnego poszukiwania haseł (tj. atak siłowy „brute force‟).

Klucze nagłówka używane przez szyfry w kaskadzie są od siebie niezależne (pomimo tego, że są wyprowadzane z jednego hasła [z którym mogą być powiązane pliki klucza]). Na przykład w przypadku kaskady AES-Twofish-Serpent funkcja wyprowadzania klucza nagłówka jest zainstruowana do wyprowadzenia 768-bitowego klucza szyfrowania z podanego hasła (dla trybu XTS także do wyprowadzenia 768-bitowego drugorzędnego klucza nagłówka z podanego hasła). Wygenerowany 768-bitowy klucz nagłówka jest następnie dzielony na trzy 256-bitowe klucze (dla trybu XTS, także drugorzędny klucz nagłówka jest dzielony na trzy 256-bitowe klucze, tak, że kaskada używa w sumie sześć 256-bitowych kluczy), z czego pierwszy klucz jest używany przez Serpent, drugi przez Twofish, a trzeci przez AES (dodatkowo, w trybie XTS, pierwszy klucz drugorzędny jest używany przez Serpent, drugi klucz drugorzędny przez Twofish, a trzeci klucz drugorzędny odpowiednio przez AES). Dzięki temu, podczas wycieku jednego z kluczy, obcy/atakujący nie będzie mógł użyć go do wyprowadzenia innych kluczy, jako, że nie istnieja metoda ustalenia hasła, z którego to został wyprowadzany klucz (wyjątek stanowi przypadek ataku siłowego bruce force, gdy założone hasło jest słabe).

 


Generator losowych liczb

Generator losowych liczb (Random Number Generator, RNG) używany jest do wygenerowania głównego klucza szyfrowania, drugorzędnego klucza (tryb XTS), soli i plików-kluczy. Tworzy on pulę losowych wartości w pamięci RAM. Pula o długości 320 bajtów jest zapełniana danymi z następujących źródeł:

  • Z ruchów myszy
  • Uderzeń w klawiaturę
  • Mac OS X i Linux: Wartości generowane przez wbudowany RNG (i /dev/random i /dev/urandom)
  • MS Windows: Windows CryptoAPI (zbierane regularnie w odstępie 500-ms)
  • MS Windows: Statystyki interfejsów sieciowych (NETAPI32)
  • MS Windows: Różne bazy Win32, zmienne czasowe i liczniki (zbierane regularnie w odstępie 500-ms)

Przed zapisem jakiejkolwiek wartości z wymienionych wyżej źródeł do puli, wartość ta jest dzielona na osobne bajty (np. 32 bitowa wartość jest dzielona na 4 bajty). Bajty te są następnie osobno zapisywane do puli w postaci operacji dodawania z modułem 28 (a nie poprzez zastępowanie starych wartości puli) na pozycję kursora puli. Po zapisie bajtów pozycja kursora puli jest zwiększana o jeden bajt. Gdy kursor osiągnie granicę (koniec) puli, jego pozycja jest zmieniana z powrotem na początek puli. Po każdym 16-tym bajcie zapisanym do puli na całym jej obszarze zostaje zastosowana funkcja mieszająca puli (patrz poniżej).

Funkcja mieszająca puli

Zadaniem tej funkcji jest zapewnianie rozproszenia. Rozproszenie rozpowszechnia działanie wprowadzonych nieprzetworzonych bitów na tak dużym obszarze puli, jak to tylko możliwe (takie działanie ukrywa też relacje statystyczne). Po każdym zapisanym do puli 16 bajcie, funkcja mieszająca jest zastosowana na całą pulę. Opis funkcji mieszającej puli:

1. R niech będzie losowością puli.

2. H niech będzie funkcją haszującą wybraną przez użytkownika (SHA-512, RIPEMD-160, lub Whirlpool).

3. l = rozmiar w bajtach wartości wyjściowej funkcji haszującej H (tj., jeśli H jest RIPEMD-160, to l = 20; jeśli H to SHA-512, l = 64)

4. z = rozmiar w bajtach losowości puli R (320 bajtów)

5. q = z / l – 1 (np., jeśli H jest Whirlpool, to q = 4)

6. R jest podzielone na bloki B0…Bq. l-bajt Dla 0 < i < q (tj., dla każdego bloku B) są wykonywane następujące kroki:

a. M = H (B0 || B1 || … || Bq) [tj., losowość pola jest haszowana przy użyciu funkcji haszującej H, co daje w rezultacie hasz M]

b. Bi = Bi ^ M

7. R = B0 || B1 || … || Bq

Na przykład, jeśli q = 1, to losowość puli będzie wymieszana następująco:

1. (B0 || B1) = R

2. B0 = B0 ^ H(B0 || B1)

3. B1 = B1 ^ H(B0 || B1)

4. R = B0 || B1

Generowane wartości

Zawartość puli RNG nie jest nigdy eksportowana (nawet gdy TrueCrypt wyda polecenie wygenerowania wartości RNG i eksportowania jej). Dzięki temu, nawet gdy atakujący zdobędzie wygenerowaną wartość, to i tak będzie niemożliwym określenie lub przewidzenie (przy użyciu przechwyconej wartości), jakie inne wartości RNG zostały wygenerowane podczas sesji (niemożliwe jest określenie zawartości puli na podstawie wartości wygenerowanej przez RNG).

RNG wykonuje w tym celu następujące czynności (za każdym razem, gdy TrueCrypt wydaje polecenie wygenerowania i eksportowania wartości):

1. Dane uzyskane ze źródeł (wypisanych powyżej) są dodawane do puli (w sposób przedstawiony powyżej).

2. Wymagana liczba bajtów jest kopiowana z puli do wyjściowego bufora (kopiowanie rozpoczyna się z pozycji kursora puli; gdy osiągnięty zostanie koniec puli, kopiowanie rozpoczyna się od początku puli; jeśli wymagana liczba bajtów jest większa niż rozmiar puli, wartość nie zostaje wygenerowana i operacja zakończyła się błędem).

3. Przestawiony zostaje stan każdego z bitów z puli (tj., 0 jest zmieniane na 1, a 1 jest zmieniana na 0).

4. Dane uzyskane ze źródeł (wypisanych powyżej) są dodawane do puli (w sposób przedstawiony powyżej).

5. Zawartość puli zostaje zmodyfikowana za pomocą funkcji mieszającej puli. Uwaga: Funkcja używa zabezpieczonej kryptograficznie jednokierunkowej funkcji haszującej wybranej przez użytkownika (zobacz powyższą sekcję Funkcja mieszająca puli aby dowiedzieć się więcej)

6. Zmodyfikowana zawartość puli jest zXORowona do wyjściowego bufera w następujący sposób:

a. Wartość kursora zapisu bufora wyjściowego jest ustawiona na 0 (pierwszy bajt bufora).

b. Bajt znajdujący się w pozycji kursora puli zostaje odczytany z puli i zXORowany do bajta w buforze wyjściowym w pozycji kursora zapisu bufora wyjściowego.

c. Pozycja kursora puli jest zwiększana o jeden bajt. Gdy zostanie osiągnięty koniec puli, to pozycja kursora jest ustawiana na 0 (pierwszy bajt puli).

d. Pozycja kursora zapisu bufora wyjściowego jest zwiększona o jeden bajt.

e. Kroki b-d są powtarzane dla każdego pozostałego bajta z bufora wyjściowego (którego długość jest równa wymaganej liczbie bajtów).

7. Zawartość bufora wyjściowego (który jest finalną wartością wygenerowaną przez RNG) jest eksportowana.

Geneza projektu

Projekt i realizacja generatora losowych liczb powstały w oparciu o następujące prace:

  • Software Generation of Practically Strong Random Numbers, Peter Gutmann
  • Cryptographic Random Numbers, Carl Ellison

 


Pliki klucza

Zawartość pliku klucza TrueCrypt jest chroniona hasłem. Użytkownik może wybrać jakikolwiek plik i używać go jako pliku klucza. Może także wygenerować plik klucza używając wbudowanego w program Generatora losowych liczb, który generuje plik z przypadkową zawartością (więcej informacji znajdziesz w sekcji Generator losowych liczb). Rozmiar, jaki może przyjąć plik klucza nie ma określonego maksimum, jednak przetwarzane jest tylko jego pierwsze 1,048,576 bajtów (1 MB), wszystkie pozostałe bajty są pomijane ze względu na możliwe problemy z wydajnością towarzyszące przetwarzaniu dużych plików. Użytkownik może dostarczyć jeden lub więcej plików klucza (tu również nie ma limitu). Pliki klucza mogą być przechowywane na żetonach zgodnych ze standardami PKCS-11 jak i na kartach chipowych (smartcard) chronionych różnymi kodami PIN (uwierzytelnienie następuje poprzez urządzenie PIN pad lub poprzez TrueCrypt GUI). Pliki klucza są przetwarzane i zastosowane do hasła w następujący sposób:

1. P niech będzie hasłem wolumenu TrueCrypt dostarczonym przez użytkownika (może być puste)

2. KP niech będzie pulą pliku klucza

3. kpl niech będzie rozmiarem puli pliku klucza KP w bajtach (64, tj., 512 bitów); kpl musi być wielokrotnością rozmiaru wyjściowego funkcji haszującej H

4. pl niech będzie długością hasła P w bajtach (w obecnej wersji: 0 < pl < 64)

5. jeśli kpl > pl, dodaj (kpl – pl) zerobajtów do hasła P (więc pl = kpl)

6. Wypełnij pulę pliku klucza kpl zero bajtami.

7. Dla każdego pliku klucza wykonaj następujące kroki:

a. Ustaw pozycję kursora puli klucza pliku na początek puli

b. Zainicjuj funkcję haszującą H

c. Załaduj wszystkie bajty pliku klucza jeden po drugim i dla każdego załadowanego bajtu wykonaj poniższe kroki:

i. Zahaszuj załadowany bajt używając funkcji haszującej H nie inicjując haszu, aby uzyskać pośredni hasz (stan) M. Nie kończ haszu (stan jest zachowany do następnej rundy).

ii. Podziel stan M na osobne bajty. Na przykład, jeśli rozmiar wyjściowy haszu to 4 bajty, to (T0 || T1 || T2 || T3) = M

iii. Zapisz te bajty (uzyskane w kroku 7.c.ii) osobno do puli pliku klucza z modułem 28 operacji dodawania (a nie poprzez nadpisanie starej wartości puli) na pozycję kursora puli. Po zapisaniu bajtu, pozycja kursora puli jest zwiększana o jeden bajt. Gdy kursor osiąga koniec puli, jego pozycja jest ustawiana na początek puli.

8. Zastosuj zawartość puli pliku klucza do hasła P w ten sposób:

a. Podziel hasło P na osobne bajty B0…Bpl-1. Pamiętaj, że jeśli hasło było krótsze niż pula pliku klucza, to zostało ono wypełnione zerobajtami do długości puli w Kroku 5 (dlatego w tym momencie długość hasła jest zawsze większa lub równa długości puli pliku klucza).

b. Podziel pulę pliku klucza KP na osobne bajty G0…Gkpl-1

c. Dla 0 < i < kpl wykonaj: Bi = Bi Gi

d. P = B0 || B1 || … || Bpl-2 || Bpl-1

9. Hasło P (po zastosowaniu do niego puli pliku klucza) jest teraz przekazane funkcji wyprowadzania klucza nagłówka PBKDF2 (PKCS #5 v2), która je przetwarza (razem z solą i innymi danymi) za pomocą algorytmu haszującego wybranego przez użytkownika (może być to np. SHA-512). Żeby dowiedzieć się więcej, zobacz sekcję Wyprowadzanie klucza nagłówka, sól (ciąg zaburzający) i liczba iteracji.

Funkcja haszująca H zapewnia rozproszenie. CRC-32 pełni rolę funkcji haszującej H. Następnie za pomocą kryptograficznie zabezpieczonego algorytmu haszującego przetwarzana jest wartość wyjściowa CRC-32: Zawartość puli pliku klucza (poza tym, że jest haszowana przez CRC-32) jest zastosowana do hasła, które jest później przekazane funkcji wyprowadzania klucza nagłówka PBKDF2 (PKCS #5 v2, która przetwarza hasło (razem z solą i innymi danymi) zabezpieczonym algorytmem użytkownika (np. SHA-512). Otrzymane wartości są wykorzystywane do utworzenia klucza nagłówka i drugorzędnego klucza nagłówka (tryb XTS).

 


Specyfikacja formatu wolumenu TrueCrypt

Ta specyfikacja dotyczy wolumenów utworzonych w wersji TrueCrypt 7.0 lub nowszej. Format wolumenów utworzonych z pliku jest identyczny z formatem wolumenów utworzonych z partycji/dysku (ale „nagłówek wolumenu” czy dane klucza partycji systemowej/dysku systemowego są przechowywane w ostatnich 512 bajtach pierwszej logicznej ścieżki dysku). Wolumenu TrueCrypt nie mają „sygnatury”, ani ciągu ID. Aż do momentu rozszyfrowania wyglądają jak zbiory przypadkowych danych.

Już na etapie tworzenia wolumenu TrueCrypt, jego wolne miejsce zostaje zapełnione losowymi danymi.* Są one generowane w następujący sposób: przed rozpoczęciem formatowania wolumenu za pomocą RNG generowane są tymczasowe klucze: klucz szyfrowania i drugorzędny klucz (tryb XTS). Algorytm szyfrowania wybrany przez użytkownika zostaje zainicjowany za pomocą tymczasowych kluczy. Algorytm jest następnie używany do zaszyfrowania bloków zwykłego tekstu (składających się z zer) tymczasowymi kluczami. Algorytm szyfrowania operuje w trybie XTS (zobacz sekcję Ukryty wolumen). Otrzymane bloki zaszyfrowanego tekstu wypełniają (nadpisują) wolne miejsce na wolumenie. Wszystkie tymczasowe klucze są przechowywane w pamięci RAM i po ukończeniu formatowania są wymazywane.

Specyfikacja formatu wolumenu TrueCrypt:

Offset (bajty)Rozmiar (bajty)Status zaszyfrowania†Opis
064Niezaszyfrowany§Sól
644ZaszyfrowanyCiąg ASCII "TRUE"
682ZaszyfrowanyWersja formatu wolumenu nagłówka
702ZaszyfrowanyMinimalna wersja programu wymagana do otworzenia wolumenu
724ZaszyfrowanySuma kontrolna CRC-32 (zaszyfrowanych) bajtów 256-511
7616ZaszyfrowanyZajęty (musi zawierać zera)
928ZaszyfrowanyRozmiar ukrytego wolumenu (ustawiony na 0 w nieukrytych wolumenach)
1008ZaszyfrowanyRozmiar wolumenu
1088ZaszyfrowanyOffset bajtów początku zakresu klucza głównego
1168ZaszyfrowanyRozmiar zaszyfrowanego obszaru w zakresie klucza głównego
1244ZaszyfrowanyOznaczone bity (ustawiony bit 0 dla szyfrowania systemu; ustawiony bit 1 dla wolumenu nie-systemowego zaszyfrowanego/rozszyfrowanego w miejscu; bity 2–31 są zajęte)
1284ZaszyfrowanyRozmiar sektora (w bajtach)
132120ZaszyfrowanyZajęty (musi zawierać zera)
2524ZaszyfrowanySuma kontrolna CRC-32 (zaszyfrowanych) bajtów 64-251
256Różn.ZaszyfrowanyPołączone klucze główne: podstawowy i drugorzędny**
51265024ZaszyfrowanyZajęty (Element pominięty w przypadku szyfrowania systemowego.‡‡)
6553665536Zaszyfrowany / Niezaszyfrowany§Obszar dla nagłówka ukrytego wolumenu (jeśli w wolumenei nie ma ukrytego wolumenu, to ten obszar zawiera przypadkowe dane ††). Element pominięty w przypadku szyfrowania systemowego.‡‡ Patrz bajty 0–65535.
131072Różn.ZaszyfrowanyObszar danych (zakres głównego klucza). W przypadku szyfrowania system offset może się różnić (zależnie od parametru offset partycji systemowej).
S-131072‡65536Zaszyfrowany / Niezaszyfrowany §Kopia zapasowa nagłówka (zaszyfrowana innym kluczem nagłówka, wyprowadzanym przy użyciu innej soli). Element pominięty w przypadku szyfrowania systemowego.‡‡ Patrz bajty 0–65535.
S-65536‡65536Zaszyfrowany / Niezaszyfrowany §Kopia zapasowa nagłówka dla ukrytego wolumenu (zaszyfrowanego innym kluczem nagłówka wyprowadzanego przy użyciu innej soli). Jeśli w wolumenie nie ma ukrytego wolumenu, ten obszar składa się z przypadkowych danych.†† Element pominięty w przypadku szyfrowania systemowego.‡‡ Patrz bajty 0–65535.

* Zakładając, że opcje Szybki Format i Dynamiczny są wyłączone i że wolumen nie zawiera systemu plików który został zaszyfrowany w miejscu (pamiętaj, że TrueCrypt nie pozwala na tworzenie ukrytych wolumenów w takich wolumenach)

† Zaszyfrowane obszary nagłówka wolumenu są zaszyfrowane w trybie XTS za pomocą podstawowego i drugorzędnego klucza. Więcej informacji znajdziesz w sekcji Schemat szyfrowania i w sekcji Wyprowadzanie klucza nagłówka, sól (ciąg zaburzający) i liczba iteracji.

‡ S oznacza rozmiar hosta wolumenu (w bajtach)

§ Pamiętaj, że sól nie musi być szyfrowana – nie musi być tajna (sól jest ciągiem przypadkowych wartości).

** Powiązane klucze główne są tutaj przechowywane, gdy wolumen jest zaszyfrowany kaskadą szyfrów (drugorzędne klucze główne są potrzebne dla trybu XTS).

†† Informacje o sposobie wypełniania wolnego przestrzeni wolumenu losowymi danymi podczas etapu tworzenia wolumenu znajdziesz powyżej w tej sekcji.

‡‡ W tym przypadku “szyfrowanie systemu” nie obejmuje ukrytych wolumenów zawierających ukryty system operacyjny.

Pola zlokalizowane w bajcie #0 (sól) i #256 (klucze główne) zawierają losowe wartości wygenerowane Generatorem losowych liczb (zobacz sekcję Generator losowych liczb) podczas tworzenia wolumenu.

Jeśli wolumen zawiera ukryty wolumen (w obszarze wolnej przestrzeni), to nagłówek ukrytego wolumenu jest zlokalizowany w bajcie #65536 wolumenu-hosta (nagłówek wolumenu hosta/zewnętrznego wolumenu jest zlokalizowany w bajcie #0 wolumenu-hosta – zobacz sekcję Ukryty wolumen). Jeśli w wolumenie nie ma ukrytego wolumenu, bajty 65536–131071 wolumenu (tj. obszaru, gdzie może mieścić się nagłówek ukrytego wolumenu) zawierają przypadkowe dane (powyżej znajdziesz informacje, jak wypełnia się obszar wolnej przestrzeni wolumenu przypadkowymi danymi podczas procesu tworzenia wolumenu).

Układ przestrzeni nagłówka ukrytego wolumenu jest identyczny z układem standardowego wolumenu (bajty 0–65535).

Maksymalny rozmiar wolumenu TrueCrypt to 263 bajty (8,589,934,592 GB). Jednak ze względów bezpieczeństwa (i ze względu na 128-bitowy blok używany przez algorytmy szyfrowania), maksymalny dozwolony rozmiar to 1 PB (1,048,576 GB).

Połączone kopie zapasowe nagłówków

Każdy wolumen utworzony w wersji programu TrueCrypt 6.0 lub nowszej zawiera połączoną kopię zapasową nagłówka umieszczoną na końcu wolumen (patrz wyżej). Kopia zapasowa nagłówka nie jest kopią nagłówka wolumenu, a to dlatego, że jest zaszyfrowana innym kluczem nagłówka wyprowadzonym przy użyciu innej soli (zobacz sekcję Wyprowadzanie klucza nagłówka, sól (ciąg zaburzający) i liczba iteracji).

Kiedy hasło wolumenu i/lub pliki klucze zostają zmienione, lub nagłówek zostaje przywrócony z połączonej (lub zewnętrznej) kopii nagłówka, to zarówno nagłówek wolumenu, jak i kopia nagłówka (połączona w wolumenie) ulegają ponownemu zaszyfrowaniu innymi kluczami nagłówka (wyprowadzonymi za pomocą nowo wygenerowanych soli – sól dla nagłówka wolumenu jest inna niż sól przeznaczona dla kopii nagłówka). Każda sól jest generowana przez Generator losowych liczb TrueCrypt (zobacz sekcję Generator losowych liczb).

Aby dowiedzieć się więcej na temat kopii zapasowych nagłówków, zobacz podsekcję Narzędzia -> Przywróć nagłówek wolumenu w dziale Główne okno programu.

 


Zgodność ze standardami i specyfikacjami

Oprogramowanie TrueCrypt jest zgodne z następującymi standardami, specyfikacjami i rekomendacjami:

  • ISO/IEC 10118-3:2004
  • FIPS 197
  • FIPS 198
  • FIPS 180-2
  • NIST SP 800-3E
  • PKCS #5 v2.0
  • PKCS #11 v2.20

Zgodność wdrożonych algorytmów szyfrowania może być zweryfikowana za pomocą wektorów testowych (wybierz Narzędzia -> Wektory testowe) lub poprzez sprawdzenie kodu źródłowego TrueCrypt.

 


Kod źródłowy

TrueCrypt jest darmowym oprogramowaniem otwartoźródłowym. Kompletny kod źródłowy (napisany w języku C, C++ i w języku asembler) jest ogólnodostępny na stronie

www.truecrypt.ch

 

 

Cyfrowa Matka

Może Ci się również spodoba

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *