CSS (ang. Content Scramble System)

Szyfr strumieniowy z kluczem symetrycznym

  • 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 zastrzegł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 , 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 . 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. Zdefiniowanych jest kilka tabel przekształceń, różniących się między sobą wartościami współ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 dwukrotnym sumowaniem XOR ze strumieniem klucza.

Tryby pracy CSS

  • uwierzytelnianie 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óry 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, kandydató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

  1. 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-odpowiedź (ang. challenge-response), przy użyciu CSS jako metody 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:

    1. Host otrzymuje kod AGID (ang. Authentication Grant ID) od odtwarzacza DVD. AGID pełni rolę numeru sesji dla aktualnej wymiany informacji.
    2. Host generuje strumień 10 bajtów i wysyła go do odtwarzacza DVD, który szyfruje go i odsyła z powrotem 5 bajtową sekwencję.
    3. Host odszyfrowuje odpowiedź i upewnia się, że 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.
    4. Odtwarzacz DVD generuje 10-bajtowy ciąg bajtów i wysyła go do hosta. Host szyfruje go.
    5. Host odsyła zaszyfrowaną odpowiedź - czyli klucz KEY2 - do odtwarzacza.
    6. 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).

    7. Host odczytuje klucz dysku z płyty DVD.
    8. 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ą.

  2. 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.

  3. 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.

  4. Wysłanie zaszyfrowanych danych

    Host czyta z DVD cały zaszyfrowany sektor danych.

  5. 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 algorytmu CSS dla danych audiowizualnych

Schemat blokowy algorytmu CSS dla bajtów klucza

Schemat algorytmu CSS dla szyfrowania klucza

Schemat blokowy dodatkowego szyfrowania kluczy w CSS

Schemat blokowy dodatkowego szyfrowania kluczy w CSS

Schemat blokowy działania rejestrów LFSR w CSS

Schemat działania rejestrów LFSR

Matematyka

Inicjalizacja rejestrów

Na podstawie sekretnego klucza o długości 40 bitów wypełniane są dwa , 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ść ), 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-17
Działanie rejestru LFSR-17

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.

Działanie rejestru LFSR-25
Działanie rejestru LFSR-25

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.

Tabela trybów pracy inwerterów
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.

Tabela przekształceń dla odszyfrowywania danych audiowizualnych z płyty DVD
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

Rejestr przesuwający z liniowym sprzężeniem zwrotnym - LFSR (ang. Linear Feedback Shift Registers) - to rejestr, którego bit wejściowy jest funkcją liniową jego poprzedniego stanu.

Najbardziej popularną funkcją liniową stosowaną na bitach jest XOR, więc zwykle bit wejściowy do LFSR konstruowany jest za pomocą funkcji XOR wywołanej na bitach rejestru. Początkowa wartość rejestru nazywana jest ziarnem, zarodkiem (ang. seed). Dalsze operacje są deterministyczne, kolejne wartości rejestru są wyznaczane przez ich aktualny stan. Z powodu ograniczonej ilości dostępnych stanów, po pewnym czasie wartości w rejestrze zaczynają się powtarzać.

Rejestry LFSR są wykorzystywane w licznikach, aplikacjach generujących pseudo-losowe liczby, w telekomunikacji i kryptografii. Implementowane są zarówno programistycznie, jak i sprzętowo.

Do czasu złamania zabezpieczeń CSS nie istniały żadne odtwarzacze DVD działające pod Linuxem - brało się to z olbrzymich opłat licencyjnych, jakie twórcy zabezpieczeń DVD ściągali rocznie od twórców programów i sprzętu obsługującego ten standard. Po opublikowaniu kodu programu DeCSS, przez jakiś czas korporacje starały się bezskutecznie powstrzymywać rozprzestrzenianie się tej aplikacji.

Zainicjowanie rejestru LFSR samymi zerami sprawia, że będzie on produkował również tylko same zera i jego stan pozostanie zerowy.

Host wysyła komendę SCSI REPORT_KEY z ustawionym parametrem INVALIDATE_AGID, żeby zresetować sterownik odtwarzacza.

Następnie host wysyła tę samą komendę REPORT_KEY z ustawionym parametrem GET_AGID, żeby otrzymać numer AGID.

AGID może przyjąć jedną z następujących wartości: 0x00, 0x40, 0x80 lub 0xC0.

Numer ten jest dodawany do parametrów w kolejnych komendach SCSI REPORT_KEY i SEND_KEY żeby umożliwić odtwarzaczowi identyfikację aplikacji.

Host wysyła komendę SCSI SEND_KEY z parametrem SEND_CHALLENGE_KEY i numerem AGID. Do komendy host załącza dowolną 10-bajtową sekwencję bajtów, która tworzy pytanie (ang. challenge) hosta do odtwarzacza.

Potem host wysyła komendę SCSI REPORT_KEY z parametrem GET_KEY1 i numerem AGID.

Otrzymane od odtwarzacza 5 bajtów tworzy klucz KEY1.

Host upewnia się co do stosowanego przez odtwarzacz wariantu, samodzielnie szyfrując swoje zapytanie o długości 10 bajtów. Używa w tym celu algorytmu CSS w trzecim trybie (ang. mode 3) dla klucza KEY1.

Host szyfruje swoje zapytanie 32 razy, po jednym razie dla każdego wariantu, który może wybrać odtwarzacz (warianty na odtwarzaczu numerowane są od 0 do 31). Następnie przyjmuje ten wariant, dla którego KEY1 otrzymany od odtwarzacza i KEY1 wyliczony samodzielnie są takie same.

Host wysyła komendę SCSI REPORT_KEY z parametrem GET_CHALLENGE i numerem AGID.

Odtwarzacz zwraca losową sekwencję 10 bajtów.

Host szyfruje otrzymane bajty za pomocą algorytmu CSS w trzecim trybie (ang. mode 3) dla klucza KEY2 i obliczonego w poprzednim kroku wariantu. Rezultatem jest KEY2 o długości 5 bajtów.

Host wysyła KEY2 do odtwarzacza za pomocą komendy SCSI SEND_KEY z parametrem SEND_KEY2 i numerem AGID.

Klucz sesji jest obliczany za pomocą algorytmu CSS w trybie 3 dla klucza sesji (BUSKEY) i przy użyciu wariantu ustalonego wcześniej. Klucze KEY1 i KEY2 są włączone i przesyłane do zaszyfrowania, a w wyniku otrzymuje się 5 bajtów klucza sesji.

Host wysyła do odtwarzacza komendę SCSI READ_DVD_STRUCTURE z parametrem GET_DISK_KEY i numerem AGID.

Otrzymany klucz dysku jest sumowany XOR z kluczem sesji.