Krzysztof Diks, Marcin Kubica
Tłumaczenie


Double Crypt


Rozwinięty Standard Szyfrowania (z angielskiego AES) korzysta z nowego algorytmu szyfrowania. Używa się w nim trzech bloków, każdy złożony ze 128 bitów. Dla danego bloku komunikatu p (tekst jawny) i bloku klucza k, funkcja szyfrująca E w standardzie AES oblicza zaszyfrowany blok c (tekst zaszyfrowany):

c = E (p, k).

Funkcją odwrotną dla funkcji szyfrującej E jest funkcja deszyfrująca D taka, że:

D (E (p, k), k ) = p, E (D (c, k), k ) = c.

W Podwójnym Szyfrowaniu AES używa się kolejno dwóch niezależnych bloków kluczy k1 i k2:

c2 = E (E (p, k1), k2)
.

W tym zadaniu dana jest także liczba całkowita s. We wszystkich kluczach tylko 4cdot s skrajnie lewych bitów ma znaczenie, podczas gdy wszystkie pozostałe bity (skrajnie prawe 128 - 4cdot s) są równe 0.

Twoim zadaniem jest odtworzenie pary kluczy szyfrujących dla pewnych komunikatów zaszyfrowanych za pomocą Podwójnego AES. Znasz zarówno tekst jawny p, odpowiadający mu podwójnie zaszyfrowany tekst c2, jak i strukturę kluczy szyfrujących zadaną przez liczbę całkowitą s.

Algorytmy szyfrowania i deszyfrowania w systemie AES są dostępne w bibliotece. Do oceny przedkładasz odtworzone klucze, a nie program do ich odtwarzania.

WEJŚCIE

Zestawy danych dla tego zadania są zapisane w plikach tekstowych o nazwach double1.in - double10.in. Każdy plik wejściowy składa się z trzech wierszy. Pierwszy wiersz zawiera liczbę całkowita s, w drugim wierszu znajduje się blok jawnego tekstu p, natomiast trzeci wiersz zawiera blok tekstu zaszyfrowanego c2 otrzymany za pomocą Podwójnego Szyfrowania AES. Oba bloki są zapisane w postaci 32-znakowych słów szesnastkowych (o cyfrach 0,..., 9, A, ..., F). Biblioteka zawiera procedurę konwersji słów na bloki. Dla każdego zestawu danych wejściowych istnieje rozwiązanie.

WYJŚCIE

Do oceny przedstawiasz 10 plików wyjściowych odpowiadających danym plikom wejściowym. Każdy plik wyjściowy składa się z trzech wierszy. Pierwszy wiersz zawiera tekst:

\#FILE double I

gdzie I jest numerem odpowiedniego pliku wejściowego. Drugi wiersz zawiera blok klucza k1, a trzeci wiersz blok klucza k2, takie że: c2 = E (E (p, k1), k2). Oba bloki muszą być zapisane jako 32-znakowe słowa szesnastkowe (o cyfrach 0,..., 9, A, ..., F). Biblioteka zawiera procedurę do konwersji bloków na słowa. Jeśli istnieje wiele rozwiązań wystarczy, że przedstawisz tylko jedno z nich.

PRZYKŁAD

Plik przedstawiony w tym przykładzie ma numer 0.

begin(tabular)(ll) 
...

BIBLIOTEKA

Biblioteka dla FreePascala (Linux: aeslibp.p, aeslibp.ppu, aeslibp.o; Windows: aeslibp.p, aeslibp.ppw, aeslibp.ow*):


type

HexStr = String [ 32 ]; only '0'..'9', 'A'..'F'

Block = array [ 0..15 ] of Byte; 128 bits

procedure HexStrToBlock ( const hs: HexStr; var b: Block );

procedure BlockToHexStr ( const b: Block; var hs: HexStr );

procedure Encrypt ( const p, k: Block; var c: Block );

c = E(p,k)

procedure Decrypt ( const c, k: Block; var p: Block );

p = D(c,k)

Do dyspozycji masz program aestoolp.pas, który pokazuje jak korzystać z takiej biblioteki.

Biblioteka dla GNU C/C++ (Linux i Windows: aeslibc.h, aeslibc.o*):


typedef char HexStr[33]; /* '0'..'9', 'A'..'F', '\0'-terminated */

typedef unsigned char Block[16]; /* 128 bits */

void hexstr2block ( const HexStr hs, /* out-param */ Block b );

void block2hexstr ( const Block b, /* out-param */ HexStr hs );

void encrypt ( const Block p, const Block k, /* out-param */ Block c );

/* c = E(p,k) */

void decrypt ( const Block c, const Block k, /* out-param */ Block p );

/* p = D(c,k) */

Program aestoolc.c pokazuje jak korzystać z tej biblioteki.

OGRANICZENIA

Liczba określająca liczbę istotnych cyfr szesnastkowych w kluczu spełnia nierówność 1 le s le 5.

Wskazówka: Dobry program potrafi dla każdego dozwolonego pliku wejściowego odtworzyć klucze w czasie mniejszym niż 10s.