ου γαρ εστιν κρυπτον ο ου φανερον γενησεται ουδε αποκρυφον ο ου γνωσθησεται και εις φανερον ελθη
Wersja PL ENG Version

CSS (ang. Content Scramble System)

  • Ogólny opis
  • Algorytm
  • Schematy blokowe
  • Funkcje matematyczne
  • Implementacja
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.
Szyfr strumieniowy z kluczem symetrycznym
Długość klucza = 40 bitów

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.

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 AB 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-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:
    1. 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.
    2. 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.
    3. 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.
    4. 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.
    5. Host odsyła zaszyfrowaną odpowiedź - czyli klucz KEY2 - do odtwarzacza. Kliknij tutaj, aby dowiedzieć się więcej.
    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. Kliknij tutaj, aby dowiedzieć się więcej.
    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.

CSS - algorytm dla danych audiowizualnych
Schemat algorytmu CSS dla danych audiowizualnych
CSS - algorytm dla bajtów klucza
Schemat algorytmu CSS dla szyfrowania klucza
CSS - działanie rejestrów LFSR
Schemat działania rejestrów LFSR
  
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 Vi 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.

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

Rejestr 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
33733B2663236B763E7E362B6E2E667B
D393DB0643034B96DE9ED60B4E0E469B
57175F82C787CF125A1A528FCA8AC21F
D999D10049094190D898D00148084091
3D7D35246D2D65743C7C34256C2C6475
DD9DD5044D0D4594DC9CD4054C0C4495
59195180C989C11058185081C888C011
D797DF0247074F92DA9AD20F4A0A429F
53135B86C383CB165E1E568BCE8EC61B
B3F3BBA6E3A3EBF6BEFEB6ABEEAEE6FB
37773F2267276F723A7A322F6A2A627F
B9F9B1A0E9A9E1F0B8F8B0A1E8A8E0F1
5D1D5584CD8DC5145C1C5485CC8CC415
BDFDB5A4EDADE5F4BCFCB4A5ECACE4F5
39793120692961703878302168286071
B7F7BFA2E7A7EFF2BAFAB2AFEAAAE2FF
Strona w trakcie budowy.