CSS (ang. Content Scramble System)
- Długość klucza = 40 bitów
Przedstawiony przez organizację DVD Forum w roku 1996 i przeznaczony do szyfrowania zawartości płyt DVD. Prawa do CSS zatrzegła sobie organizacja DVD Copy Control Association.
Zastosowanie
Błędy w projekcie szyfru powodują, że długość efektywnego klucza wynosi około 16 bitów.
Szyfr został złamany w roku 1999 za pomocą ataku siłowego (ang. brute force) - wtedy to w Internecie pojawił się kod źródłowy programu DeCSS, który potrafił złamać zabezpieczenia CSS.
Algorytm
CSS jest szyfrem strumieniowym. Za pomocą pięciobajtowego sekretnego klucza inicjowana jest maszyna stanów o długości 42 bitów, składająca się z dwóch rejestrów przesuwających z liniowym sprzężeniem zwrotnym - LFSR (ang. Linear Feedback Shift Registers). Generowany przez rejestry strumień bajtów klucza sumowany jest XOR ze strumieniem danych wejściowych. Przed sumowaniem bajty strumienia danych są modyfikowane według tabeli przekształceń, natomiast bajty strumienia klucza przechodzą przez opcjonalne inwertery. Zdefinowanych jest kilka tabel przekształceń, różniących się między sobą wartościami wspołczynników.
Szyfr CSS ma za zadanie chronić dane audiowizualne zakodowane na płytach DVD. W całym systemie CSS znajduje się kilka kluczy, które wykorzystywane są do wzajemnego uwierzytelniania elementów, szyfrowania określonych sektorów i całych plików. Niektóre klucze są przechowywane w zaszyfrowanej formie i żeby móc ich używać druga strona musi je najpierw rozszyfrować (używając szyfru CSS, gdzie rolę danych pełnią zaszyfrowane bajty poszukiwanego klucza).
Z powodu wielu różnych typów zadań CSS - pracy z danymi audiowizualnymi i różnymi kluczami - istnieje parę trybów pracy szyfru CSS. Wszystkie one są podobne do siebie jeśli chodzi o ideę, ale różnią się niewielkimi szczegółami (na przykład współczynnikami w tabelach).
Kiedy danymi do odszyfrowania są bajty jednego z sekretnych kluczy CSS, 5 zakodowanych bajtów tych kluczy jest mieszanych z otrzymanymi bajtami strumienia klucza w bardziej skomplikowany sposób. Zamiast prostego podstawienia w tabelach przekształceń i sumowania XOR ze strumieniem klucza, następuje dwukrotne podstawianie w tabelach wymieszane z drukrotnym sumowaniem XOR ze strumieniem klucza.
Tryby pracy CSS
- uwierzytelniane i nawiązywanie połączenia - host nawiązuje połączenie z dyskiem DVD, obie strony ustalają klucz sesji,
- odszyfrowanie klucza dysku - host pobiera i odszyfrowuje klucz dysku za pomocą jednego z kluczy odtwarzacza,
- odszyfrowanie klucza tytułu - host pobiera i odszyfrowuje klucz tytułu za pomocą uzyskanego klucza dysku,
- odszyfrowanie danych audiowizualnych - za pomocą uzyskanego klucza tytułu i odczytanego z płyty DVD klucza sektora, host odszyfrowuje bajty zawierające film i dźwięk zapisane na płycie DVD.
Klucze w CSS
- klucze odtwarzacza (ang. player keys) - zapisane na stałe w odtwarzaczu DVD; służą do odkodowania zapisanego na dysku DVD klucza dysku,
- klucz dysku (ang. disk key) - zaszyfrowany na stałe na dysku DVD i odkodowywany przez odtwarzacz DVD przy użyciu klucza odtwarzacza; służy do odkodowania klucza tytułu,
- klucz sektora (ang. sector key) - zapisany w postaci jawnej w każdym sektorze danych na dysku DVD i pobierany przez odtwarzacz DVD; razem z kluczem tytułu służą do odkodowywania danych w sektorze,
- klucze tytułu (ang. title key) - zaszyfrowane na stałe na dysku DVD i odkodowywane przez odtwarzacz DVD przy użyciu zdobytego wcześniej klucza dysku; służą do odkodowywania danych audiowizualnych,
- klucz sesji (ang. session key lub bus key) - ustalany na podstawie losowych danych w procesie uwierzytelniania pomiędzy hostem i płytą DVD; służy do szyfrowania całej dalszej komunikacji pomiędzy nimi.
System CSS
Cały system CSS składa się z trzech elementów: dysku DVD, odtwarzacza DVD i hosta (komputera, programu do odtwarzania DVD).
Każda płyta DVD posiada zakodowany swój unikalny klucz dysku, podobnie wszystkie odtwarzacze DVD mają zapisane kilka kluczy odtwarzacza. Każda płyta DVD posiada ukryty sektor (ang. hidden sector), która zawiera klucz dysku w wielu kopiach zaszyfrowanych przy użyciu każdego z 409 istniejących kluczy odtwarzacza. Na zapisywalnych płytach DVD ukryty sektor jest wyzerowany. Odtwarzacz próbując odczytać dysk DVD, używa swoich kluczy odtwarzacza do rozszyfrowania którejś z kopii zakodowanego klucza dysku na płycie DVD.
Po każdej próbie i otrzymaniu wyniku, który może być poprawnym kluczem dysku, odtwarzacz przeprowadza następujący test: próbuje za jego pomocą (czyli za pomocą otrzymanych 5 bajtów, kondydatów na klucz dysku) odszyfrować sekwencję testową (zapisaną na dysku DVD), która jest prawdziwym kluczem dysku, zaszyfrowanym za pomocą prawdziwego klucza dysku. Jeśli używając domniemanego klucza dysku odtwarzacz uzyska ten sam wynik (czyli te same 5 bajtów, których użył jako klucza), to można mieć pewność, że otrzymany klucz dysku jest prawidłowy.
Płyta DVD zawiera zwykle kilka zakodowanych kluczy tytułu, z których każdy zabezpiecza jedną część filmu, nazywaną VTS (ang. Video Title Set). Na każdy VTS przypada zestaw plików nazwanych w formacie VTS_AA_B.CCC, gdzie każde A i B oznacza jedną cyfrę, a CCC to jedno z trzech rozszerzeń plików (.VOB, .BUP lub .IFO). Wszystkie pliki mające taką samą liczbę AA składają się właśnie na jeden VTS. Klucze tytułu są odkodowywane za pomocą klucza dysku.
Każdy sektor danych na płycie DVD ma wielkość 2048 bajtów (czyli ma taką samą długość co sektory na płytach CD-ROM). Sektor rozpoczyna się od nagłówka MPEG-2 PACK (ang. MPEG-2 PACK header) o długości 128 bajtów, po którym znajdują się albo dane audiowizualne (ang. stream data; czyli dane w formacie MPEG-2, AC-3 itd.), albo inne informacje (PCI lub DSI). Klucz sektora jest zapisany w postaci jawnej w bajtach o numerach 80-84.
Jeżeli sektor zawiera dane audiowizualne, za nagłówkiem MPEG-2 PACK znajduje się nagłówek danych audiowizualnych (ang. stream header), który zawiera 2 bity określające typ szyfrowania.
- 00 - brak szyfrowania
- 01 - szyfrowanie CSS
- 10 - nieznany/zarezerwowany kod
- 11 - szyfrowanie CPRM
Jeżeli sektor nie zawiera danych audiowizualnych, te dwa bity są nieobecne (dane nie-audiowizualne w sektorach nie są szyfrowane).
Do odszyfrowania danych na płycie używane są dwa zsumowane klucze - klucz sektora (inny dla każdego sektora) i klucz tytułu (każda płyta DVD zawiera zwykle kilka kluczy tytułu, po jednym dla różnych fragmentów danych). Pierwsze dwa bajty klucza tytułu są dodawane XOR z dwoma pierwszymi bajtami klucza sektora przed przekazaniem ich do LFSR-17. Pozostałe trzy bajty klucza tytułu są dodawane XOR z 3 bajtami klucza sektora (o numerach 82-84) i przekazywane do LFSR-25. Host uzyskuje klucz tytułu używając zdekodowanego wcześniej klucza dysku.
Każda płyta DVD posiada również zapisany kod regionu (ang. region code), który określa część świata, w której dana płyta może być odtwarzana.
Protokół CSS
- Wzajemne uwierzytelnianie (ang. Mutual authentication)
W celu odczytania płyty DVD w napędzie DVD, host musi najpierw uwierzytelnić się za pomocą protokołu pytanie-odpowiedz (ang. challenge-response), przy użyciu CSS jako motody szyfrowania. Teoretycznie następuje w tym momencie również uwierzytelnienie dysku DVD względem hosta, zwykle jednak program działający na hoście pomija to sprawdzanie. Podczas uwierzytelniania obie strony używają stałego klucza uwierzytelniającego (ang. authentication key) - F4 10 45 A3 E2.
Uwierzytelnienie wymaga wykonania we właściwej kolejności następujących kroków:
- Host otrzymuje kod AGID (ang. Authentication Grant ID) od odtwarzacza DVD. AGID pełni rolę numeru sesji dla aktualnej wymiany informacji. Kliknij tutaj, aby dowiedzieć się więcej.
- Host generuje strumień 10 bajtów i wysyła go do odtwarzacza DVD, który szyfruje go i odsyła spowrotem 5 bajtową sekwencję. Kliknij tutaj, aby dowiedzieć się więcej.
- Host odszyfrowuje odpowiedź i upewnia się, że jest wynik jest taki sam jak wygenerowany wcześniej ciąg bajtów. Odtwarzacz DVD może odpowiedzieć na jeden z 32 sposobów, więc host przeprowadza 32 próby żeby określić, który z 32 wariantów został wybrany przez odtwarzacz DVD. Kliknij tutaj, aby dowiedzieć się więcej.
- Odtwarzacz DVD generuje 10-bajtowy ciąg bajtów i wysyła go do hosta. Host szyfrowuje go. Kliknij tutaj, aby dowiedzieć się więcej.
- Host odsyła zaszyfrowaną odpowiedź - czyli klucz KEY2 - do odtwarzacza. Kliknij tutaj, aby dowiedzieć się więcej.
- Host odczytuje klucz dysku z płyty DVD. Kliknij tutaj, aby dowiedzieć się więcej.
W tym punkcie, zarówno host jak i odtwarzacz DVD znają wszystkie 10 bajtów - oba klucze szyfrujące utworzone przez host i odtwarzacz. Klucz sesji powstaje w wyniku zaszyfrowania 10-bajtowej sekwencji przy użyciu szyfrowania CSS w trybie 3. Klucz sesji ma 5 bajtów i zapobiega podsłuchiwaniu transmisji podczas dalszej komunikacji (w szczególności przesyłaniu kluczy tytułu i dysku).
Jeśli ten ostatni krok zakończy się sukcesem, host będzie miał możliwość czytania sektorów z dysku DVD używając zwykłych komend SCSI read. W przeciwnym razie, uwierzytelnianie kończy się porażką.
- Dekodowanie klucza dysku
Odtwarzacz DVD próbuje zdekodować klucz dysku z płyty DVD po kolei za pomocą każdego swojego klucza odtwarzacza. Każdy producent urządzeń odtwarzających DVD posiada prawo do jednego lub kilku kluczy odtwarzacza, które zapisuje w swoich urządzeniach.
- Odczytywanie i dekodowanie kluczy tytułów
Zaszyfrowane klucze tytułów są wysyłane z DVD do hosta. Przesyłane klucze tytułów (podobnie jak cała komunikacja hosta z odtwarzaczem) jest szyfrowana za pomocą klucza sesji.
- Wysłanie zaszyfrowanych danych
Host czyta z DVD cały zaszyfrowany sektor danych.
- Dekodowanie zaszyfrowanych danych
Host dekoduje cały sektor używając uzyskanego klucza tytułu i klucza sektora znajdującego się w nagłówku każdego sektora.
Schemat Blokowy algorytmu CSS dla danych audiowizualnych
Schemat Blokowy algorytmu CSS dla bajtów klucza
Schemat Blokowy dodatkowego szyfrowania kluczy w CSS
Schemat Blokowy działania rejestrów LFSR w CSS
Matematyka:
Inicjalizacja rejestrów
Na podstawie sekretnego klucza o długości 40 bitów wypełniane są dwa rejestry przesuwające z liniowym sprzężeniem zwrotnym - LFSR (ang. Linear Feedback Shift Registers), LFSR-17 o długości 17 bitów i LFSR-25 o długości 25 bitów oraz dodatkowy bit CC.
Bity pięciobajtowego sekretnego klucza są dzielone pomiędzy dwa rejestry LFSR. Oznaczając każdy bit klucza inną literą, początkowe przyporządkowanie bitów można przedstawić następująco:
KLUCZ = jklmnopq abcdefgh QRSTUWXY IJKLMNOP ABCDEFGH
LFSR-17 = q ponmlkji hgfedcba
LFSR-25 = Y XWVUTSRQ PONMLKJI HGFEDCBA
Bity w rejestrach LFSR są zapisywane w odwrotnej kolejności niż w kluczu.
Bity V i i są ustawiane na 1 (żeby wykluczyć możliwość zainicjowania rejestrów samymi zerami), natomiast CC jest ustawiany na 0.
Działanie rejestru LFSR-17
Bity są przesuwane w prawo o jedną pozycję, a nowy bit pojawiający się na wyjściu i na skrajnie lewej pozycji w rejestrze jest kombinacją bitów pierwszego i piętnastego.
Działanie rejestru LFSR-25
Bity są przesuwane w prawo o jedną pozycję, a nowy bit pojawiający się na wyjściu i na skrajnie lewej pozycji w rejestrze jest kombinacją czterech bitów z rejestru.
Tryby pracy inwerterów
W zależności od aktualnego trybu pracy CSS, inwertery mogę odwrócić wyjście z rejestrów LFSR lub przekazać je dalej bez żadnych modyfikacji.
Poniższa tabela przedstawia w jakich trybach i dla których rejestrów inwertery odwracają kolejność bitów w ośmiobitowym słowie.
Tryb pracy | LFSR-17 | LFSR-25 |
---|---|---|
Uwierzytelnianie | tak | nie |
Klucz dysku | nie | nie |
Klucz tytułu | nie | tak |
Dane | tak | nie |
Tabela przekształceń
Każdy bajt danych do zaszyfrowania lub odszyfrowania jest zastępowany przez inny bajt, na podstawie jednej z pięciu tabeli przekształceń używanych w CSS. Wybór konkretnej tabeli zależy od aktualnego trybu pracy CSS i tego czy aktualnie zachodzi szyfrowanie czy odszyfrowywanie danych.
33 | 73 | 3B | 26 | 63 | 23 | 6B | 76 | 3E | 7E | 36 | 2B | 6E | 2E | 66 | 7B |
D3 | 93 | DB | 06 | 43 | 03 | 4B | 96 | DE | 9E | D6 | 0B | 4E | 0E | 46 | 9B |
57 | 17 | 5F | 82 | C7 | 87 | CF | 12 | 5A | 1A | 52 | 8F | CA | 8A | C2 | 1F |
D9 | 99 | D1 | 00 | 49 | 09 | 41 | 90 | D8 | 98 | D0 | 01 | 48 | 08 | 40 | 91 |
3D | 7D | 35 | 24 | 6D | 2D | 65 | 74 | 3C | 7C | 34 | 25 | 6C | 2C | 64 | 75 |
DD | 9D | D5 | 04 | 4D | 0D | 45 | 94 | DC | 9C | D4 | 05 | 4C | 0C | 44 | 95 |
59 | 19 | 51 | 80 | C9 | 89 | C1 | 10 | 58 | 18 | 50 | 81 | C8 | 88 | C0 | 11 |
D7 | 97 | DF | 02 | 47 | 07 | 4F | 92 | DA | 9A | D2 | 0F | 4A | 0A | 42 | 9F |
53 | 13 | 5B | 86 | C3 | 83 | CB | 16 | 5E | 1E | 56 | 8B | CE | 8E | C6 | 1B |
B3 | F3 | BB | A6 | E3 | A3 | EB | F6 | BE | FE | B6 | AB | EE | AE | E6 | FB |
37 | 77 | 3F | 22 | 67 | 27 | 6F | 72 | 3A | 7A | 32 | 2F | 6A | 2A | 62 | 7F |
B9 | F9 | B1 | A0 | E9 | A9 | E1 | F0 | B8 | F8 | B0 | A1 | E8 | A8 | E0 | F1 |
5D | 1D | 55 | 84 | CD | 8D | C5 | 14 | 5C | 1C | 54 | 85 | CC | 8C | C4 | 15 |
BD | FD | B5 | A4 | ED | AD | E5 | F4 | BC | FC | B4 | A5 | EC | AC | E4 | F5 |
39 | 79 | 31 | 20 | 69 | 29 | 61 | 70 | 38 | 78 | 30 | 21 | 68 | 28 | 60 | 71 |
B7 | F7 | BF | A2 | E7 | A7 | EF | F2 | BA | FA | B2 | AF | EA | AA | E2 | FF |