The Simple Cryptographic Library cpp

background image

15 May 2008
Version 0.8

The Simple Cryptographic Library

written in C++

David S. Płaneta

1

Institute of Computer Science

Jagiellonian University

Pseudo Random Byte Generator
- Random

Hash functions
- MD2

[128]

- MD5

[128]

- RIPEMD

[128][160]

- HAVAL

[128][160][256]

- GostHash

[256]

- FORK256

[256]

- SHA

[160][256][512]

- Whirlpool

[512]

- MasterHash

[1024]

- MAC (Message Authentication Code)

Symmetric-key algorithms
- Stream ciphers

+ A5

[

64]key

+ RC4

[ inf]key

+ Trivium

[

80]key

+ Salsa20

[ 256]key

+ MasterCipher [ inf]key

- Block ciphers

+ Rijndael (AES) [ 128]block [128, 192, 256]key
+ Serpent

[ 128]block [128, 192, 256]key

+ Twofish

[ 128]block [

up to 256]key

+ GOST 28147-89

[

64]block [

256]key

- Cipher modes of operation

+ ECB
+ CBC
+ CFB
+ OFB
+ CTR

Asymmetric-key algorithms
- RSA
- ElGamal
- ECC (Elliptic curve cryptography)

1

e-mail: dplaneta@gmail.com

background image

Interfaces

c l a s s Hash {

public :

v i r t u a l const char ∗ GetName ( void )

const = 0 ;

v i r t u a l const void ∗ GetBuf ( void )

const = 0 ;

v i r t u a l unsigned

G e t S i z e ( void )

const = 0 ;

v i r t u a l const char ∗ G e t S t r i n g ( void ) const = 0 ;

v i r t u a l void C l e a r ( void ) = 0 ;

const void ∗ G e n e r a t e ( const void ∗ buf , unsigned s i z e ) ;

v i r t u a l void S t a r t ( void ) = 0 ;
v i r t u a l void Update ( const void ∗ i n p u t , unsigned s i z e ) = 0 ;
v i r t u a l void F i n i s h ( void ) = 0 ;

const void ∗ MAC( C i p h e r & ) ;
const void ∗ MAC( C i p h e r &, const void ∗ key , unsigned l e n g t h ) ;
const void ∗ MAC( const void ∗ key , unsigned l e n g t h ) ;

bool operator==(const Hash&)

const ;

bool operator ! = ( const Hash&)

const ;

u i n t 8 t operator [ ] ( unsigned i ) const ;

} ;

c l a s s C i p h e r {

public :

v i r t u a l const char ∗ GetName ( void )

const = 0 ;

v i r t u a l unsigned G e t B l o c k S i z e ( void ) const = 0 ;

v i r t u a l void C l e a r ( void ) = 0 ;

v i r t u a l void SetKey ( const void ∗ key , unsigned s i z e ) = 0 ;

v i r t u a l void Encrypt ( void ∗ data , unsigned s i z e ) = 0 ;
v i r t u a l void Decrypt ( void ∗ data , unsigned s i z e ) = 0 ;

v i r t u a l void Encrypt ( CipherMode&) = 0 ;
v i r t u a l void Decrypt ( CipherMode&) = 0 ;

} ;

c l a s s CipherMode {

public :

v i r t u a l const char ∗ GetName ( void ) const = 0 ;

v i r t u a l void C l e a r ( void ) = 0 ;

void SetIV ( void ∗ data , unsigned s i z e ) ;
const void ∗ GetIV ( unsigned ∗ s i z e ) ;

void S e t B u f ( void ∗ data , unsigned s i z e ) ;
void ∗ GetBuf ( unsigned ∗ s i z e ) ;

} ;

background image

Documentation

Language: Polish

Copyright (c) 2008 David S. Płaneta

All rights reserved.

Dokumentacja

Spis treści

1

Funkcje Skrótu

1

1.1

Wprowadzenie

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1

1.2

Metody kryptoanalizy funkcji skrótu

. . . . . . . . . . . . . . . . . . . . . . . . . .

1

1.3

Implementacja

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3

1.3.1

Przykład użycia

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4

1.4

MD2

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4

1.5

MD5

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5

1.6

RIPEMD

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

6

1.7

HAVAL

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7

1.8

GostHash

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7

1.9

FORK-256

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

8

1.10 SHA

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

8

1.11 Whirlpool

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

9

1.12 MasterHash

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

9

1.13 Ciąg uwierzytelniania wiadomości

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

10

1.13.1 Przykład użycia

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

11

1.14 Tęczowe tablice

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

11

2

Algorytmy Kryptografii Symetrycznej

12

2.1

Implementacja

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12

2.1.1

Przykład użycia

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

2.2

Strumieniowe Algorytmy Kryptograficzne.

. . . . . . . . . . . . . . . . . . . . . . .

13

2.2.1

A5

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14

2.2.2

RC4

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14

2.2.3

Trivium

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15

2.2.4

Salsa20

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15

2.2.5

MasterCipher

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

16

2.3

Blokowe Algorytmy Kryptograficzne

. . . . . . . . . . . . . . . . . . . . . . . . . .

16

2.3.1

Rijndael (AES)

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

17

2.3.2

Serpent

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

18

2.3.3

Twofish

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

18

2.3.4

GOST 28147-89

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

19

2.4

Tryby Kodowania

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

20

2.4.1

Implementacja

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

21

2.4.2

Przykład użycia

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

22

2.4.3

ECB

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

22

2.4.4

CBC

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

22

2.4.5

CFB

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

2.4.6

OFB

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

2.4.7

CTR

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

background image

3

Algorytmy Kryptografii Asymetrycznej

24

3.1

Implementacja

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

24

3.1.1

Przykład użycia

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

24

3.2

RSA

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

24

3.3

ElGamal

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

3.4

ECC

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

26

4

Kryptografia w przyszłości

26

4.1

Kryptografia kwantowa

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

26

4.2

Kryptografia oparta na biotechnologii – obliczenia z użyciem DNA

. . . . . . . . .

27

5

TODO

28

Klasyfikacja poszczególnych algorytmów opisanych w bibliotece.

* Algorytmy można stosować do szyfrowania niejawnej informacji. Nie są wystarczająco

bezpieczne abyśmy mogli spać spokojnie. Duże korporacje i rządy państw są w stanie
je złamać.

** Algorytmy można stosować do szyfrowania tajnych informacji. Nie są znane metody ła-

mania szyfru, które mogą wykorzystać duże korporacje. Prawdopodobnie organizacje
pokroju NSA są w stanie je złamać.

*** Algorytmy można stosować do szyfrowania ściśle tajnych informacji.

background image

1

Funkcje Skrótu

MD2, MD5, RIPEMD, Haval, FORK, GostHash, SHA, Whirlpool, MasterHash

1.1

Wprowadzenie

Funkcja skrótu [49, 111, 77] jest funkcją, która przyporządkowuje dowolnie dużej liczbie (wiado-
mości) krótką, zwykle posiadającą stały rozmiar wartość (skrót wiadomości).

Funkcje skrótu

pozwalają na ustalenie krótkich i łatwych do weryfikacji sygnatur dla dowolnie dużych zbiorów
danych. Takie sygnatury mogą chronić przed przypadkowymi lub celowo wprowadzonymi mody-
fikacjami danych (sumy kontrolne), a także mają zastosowania przy optymalizacji dostępu do
struktur danych w programach komputerowych (tablice haszujące). Argumentem funkcji skrótu
H(M ) jest wiadomość M o dowolnej długości. Wartością tej funkcji jest liczba h o ustalonej
długości. Istnieje wiele funkcji skrótu, lecz aby można było je wykorzystywać do zastosowań kryp-
tograficznych [49, 112] muszą spełniać jeszcze kilka dodatkowych założeń.

• Mając dane M , łatwo jest obliczyć h

• Mając dane h, niezwykle trudno jest obliczyć H(M ) = h

• Mając dane M , bardzo trudno jest znaleźć inną wiadomość M

0

, taką, że H(M ) = H(M

0

)

• Bardzo trudno jest znaleźć dwie wiadomości losowe M i M

0

takie, że H(M ) = H(M

0

)

• Nieznaczna zmiany M dają kompletnie różne h.

Należy zauważyć, że uznanie funkcji za bezpieczną do zastosowań kryptograficznych opiera się za-
wsze wyłącznie na domniemanej odporności na znane ataki krypto-analityczne, nie zaś na matem-
atycznych dowodach gwarantujących niemożność złamania. W szczególności bezpieczna funkcja
skrótu musiałaby być funkcją jednokierunkową, a istnienie takich funkcji nie zostało dotychczas
dowiedzione. Funkcje skrótu spełniające te założenia potocznie w informatyce nazywa się w skrócie
jednokierunkowymi.

Jeśli ktoś złamał funkcję skrótu i potrafi w praktyce (realnym czasie) tworzyć kolizję, jest w

stanie podrabiać podpisy cyfrowe, sumy kontrolne, czy też hasła (które są trzymane w formie
skrótów). Dlatego tak bardzo istotne jest bezpieczeństwo funkcji skrótu w kryptografii.

1.2

Metody kryptoanalizy funkcji skrótu

Wśród metod łamania funkcji skrótu [77] należy wyróżnić klasę ataków niewykorzystujących słabości
wewnętrznej struktury analizowanej funkcji skrótu (brutalny, urodzinowy, wieloblokowy), oraz
ataki znajdujące słabości przekształceń zastosowanych wewnątrz funkcji (różnicowy, liniowy).

Atak brutalny

Celem ataku brutalnego jest znalezienie dowolnej wiadomości m

0

6= m która po skróceniu da

zadany skrót h(m

0

) == h(m). Atak ten polega na przeszukiwaniu losowego zbioru wiado-

mości i porównywaniu z oczekiwaną wartością skrótu. Jest najwolniejszy z ataków, a jego
złożoność zarówno obliczeniowa jak i pamięciowa wynoszą O(2

n

), gdzie n to długość wyrażona

w bitach skrótu.

Atak urodzinowy Celem ataku urodzinowego jest znalezienie dowolnej pary wiadomości m

i m

0

, takich że h(m

0

) = h(m). Atak ten oparty jest na paradoksie dnia urodzin, głoszącym,

że prawdopodobieństwo tego, że spośród 23 osób, dwie mają urodziny w tym samym dniu
wynosi więcej niż

1
2

. Atak ten polega na wygenerowaniu i zapamiętaniu 2

n

2

wiadomości i

tego rzędu jest złożoność ataku urodzinowego.

1

background image

Atak wieloblokowy Celem ataku jest znalezienie dowolnej pary złożonych wiadomości

m

1

||m

2

|| . . . ||m

k

i m

0

1

||m

0

2

|| . . . ||m

0
k

, takich, że h(m

1

||m

2

|| . . . ||m

k

) = h(m

0

1

||m

0

2

|| . . . ||m

0
k

).

Atak ten stosowany jest przeciwko strukturze Merkle-Damg˚

ard [68], którą wykorzystuje więk-

szość współczesnych funkcji. W ataku tym jako wyniki cząstkowe wykorzystuje się zarówno
pseudo-kolizje(ang. pseudo-collision) jak i prawie-kolizje (ang. near-collision). Konkretyzacja
obu metod może dawać w wyniku pełne kolizje dla wieloblokowych wiadomości.

Atak różnicowy Celem tego ataku jest znalezienie dwóch wiadomości dających ten sam

skrót korzystając z niedoskonałości zastosowanej funkcji skrótu.

Różnica jest zazwyczaj

definiowana jako funkcja logiczna xor, a filozofia ataku wykorzystuje fakt, iż poprzez zmianę
kilku bitów w wiadomości prawdopodobne jest zniwelowanie różnicy wewnątrz funkcji skrótu
po kilku rundach.

2

background image

1.3

Implementacja

Wszystkie funkcje skrótu dziedziczą po abstrakcyjnej klasie Hash.

c l a s s Hash {

public :

v i r t u a l const char ∗ GetName ( void )

const = 0 ;

v i r t u a l const void ∗ GetBuf ( void )

const = 0 ;

v i r t u a l unsigned

G e t S i z e ( void )

const = 0 ;

v i r t u a l const char ∗ G e t S t r i n g ( void ) const = 0 ;

v i r t u a l void C l e a r ( void ) = 0 ;

const void ∗ G e n e r a t e ( const void ∗ buf , unsigned s i z e ) ;

v i r t u a l void S t a r t ( void ) = 0 ;
v i r t u a l void Update ( const void ∗ i n p u t , unsigned s i z e ) = 0 ;
v i r t u a l void F i n i s h ( void ) = 0 ;

const void ∗ MAC( C i p h e r & ) ;
const void ∗ MAC( C i p h e r &, const void ∗ key , unsigned l e n g t h ) ;
const void ∗ MAC( const void ∗ key , unsigned l e n g t h ) ;

bool operator==(const Hash&)

const ;

bool operator ! = ( const Hash&)

const ;

u i n t 8 t operator [ ] ( unsigned i ) const ;

} ;

GetName

Metoda zwraca nazwę funkcji skrótu (np. MD5, SHA-256 )

GetBuf

Metoda zwraca adres bufora przechowującego skrót.

GetSize

Metoda Zwraca rozmiar bufora wyrażony w bajtach.

GetString

Metoda zwraca łańcuch (hex) reprezentujący skrót, gdzie jeden znak
odpowiada 4 bitom.

Clear

Metoda zwalnia zasoby, oraz usuwa tymczasowe dane.

Generate

Metoda generuje funkcje skrótu. Parametry przyjmują wskaźnik na bufor,
oraz jego rozmiar. Metoda zwraca adres bufora przechowującego skrót.

Start

Czasami możemy zechcieć generować funkcje skrótu na podstawie kilku

Update

plików, czy bloków pamięci, dlatego aby oszczędzić kopiowania do

Finish

wspólnego bloku, możemy skorzystać z metod ‘Start’, ‘Update’ i ‘Finish’.

MAC

Funkcje skrótu MAC (ang. Message Authentication Code) umożliwiają
weryfikacje skrótu. Ich szersze omówienie jest dostępne w podrozdziale
traktującym o ciągu uwierzytelniania wiadomości

1.13

.

operator==

Sprawdza czy funkcje skrótu są takie same.

operator!=

Sprawdza czy funkcje skrótu są różne.

operator[]

Operator odwołuje się do i-tego bajtu bufora skrótu.
Podobnie jak w przypadku standardowych tablic należy uważać aby
nie przekroczyć zakresu.

Klasa posiada zablokowany konstruktor kopiujący i operator przypisania.

3

background image

1.3.1

Przykład użycia

using namespace c r y p t o ;
// Tworzę o b i e k t g e n e r u j ą c y s k r ó t .

c r y p t o : : MD5 md5 ;

// P o z o s t a ł e k l a s y ,

k t ó r e

d z i e d z i c z ą po k l a s i e Hash t o :

// MD2, RIPEMD128 , RIPEMD160 , HAVAL128, HAVAL160, HAVAL256,
// GostHash , FORK256 , SHA160 , SHA256 , SHA512 , W h i r l p o o l ,
// MasterHash

char b u f o r [ ] = ” j a k i e s dane ” ;

// G e n e r u j ę s k r ó t .

md5 . G e n e r a t e ( b u f o r ,

s t r l e n ( b u f o r ) ) ;

// Wyświetlam s k r ó t .
cout<<md5 . G e t S t r i n g ( ) ;

// Mogę t a k ż e g e n er o w a ć s k r ó t na p o d s t a w i e k i l k u b u f o r ó w .
char b u f o r 2 [ ] = ” j a k i e s dane2 ” ;

md5 . S t a r t ( ) ;
md5 . Update ( b u f o r ,

s t r l e n ( b u f o r ) ) ;

md5 . Update ( b u f o r 2 ,

s t r l e n ( b u f o r 2 ) ) ;

md5 . F i n i s h ( ) ;

cout<<md5 . G e t S t r i n g ( ) ; // Wyświetlam s k r ó t .

1.4

MD2

Funkcja skrótu MD2 została zaprojektowana przez Rona
Rivesta w 1989 roku.

Jej dokładny opis można znaleźć w

RF C1319 [113]. Funkcja generuje 128 bitowy skrót w 18 run-
dach.

Bezpieczny:

Algorytm składa się z kilku etapów:

1. Uzupełni wiadomość ‘i’ bajtami o wartości ‘i’ tak, aby wynikowa wiadomość miała długość

równą wielokrotności 16 bajtów (128 bitów).

2. Dodaj 16 bajtową (128 bitową) sumę kontrolną do wiadomości.

3. Zainicjuj 48 bajtowy (384 bitowy) blok X

0

, X

1

, X

2

, . . . , X

47

.

4. Ustaw pierwszych 16 bajtów X na zero, kolejne 16 bajtów X wypełni 16 bajtami wiadomości,

trzecie 16 bajtów to suma modulo 2 pierwszych 16 bajtów X i drugich 16 bajtów X.

5. Funkcja mieszająca

t = 0
For j=0 to 17 Begin

For k=0 to 47

t=X[k] XOR S[t]
X[k] = t[i]

End

t = (i+j) mod 256

End

4

background image

6. Ustaw drugie 16 bajtów X zgodnie z drugą 16-tką bajtów wiadomości, a trzecie 16 bajtów

X to suma modulo 2 pierwszych 16 bajtów X i drugich. Wykonaj krok (4). Powtórz krok
(4) z każdymi 16-toma bajtami wiadomości.

7. Wynikiem jest pierwszych 16 bajtów X.

Bezpieczeństwo
Bezpieczeństwo funkcji MD2 zależy od losowej permutacji bajtów. Permutacja S

0

, S

1

, . . . , S

255

jest

stała i zależy od cyfr liczby π. Funkcja miesza dane wejściowe przez 18 rund zwracając 128 bitowy
skrót. W 1995 roku został została przedstawiona praca [35], która pokazała, że MD2 jest podatna
na kolizje. W obliczu tej pracy RSA w 1996 roku w wydanym przez siebie biuletynie [36] zaleciła
aby MD2 nie wykorzystywać już w kryptografii. W roku 2004 zaprezentowano metodę ataku [57]
na funkcję MD2 o złożoności 2

104

. Mimo, że algorytm nie jest popularny przetrwał próbę czasu

i okazał się bezpieczniejszy od swoich następników MD4 i MD5. Jednak 128 bitów to zbyt mało,
jak na dzisiejsze czasy. Atak dnia urodzin przy 128 bitach wymaga O(2

64

) kroków. Przyjęło się

twierdzić, że aby funkcja skrótu nadawała się do zastosowań kryptografii dla informacji niejawnej,
najlepszy atak nie może zejść poniżej O(2

80

).

Interfejs udostępniony przez bibliotekę
Klasa MD2 dziedziczy po abstrakcyjnej klasie Hash, udostępniając tym samym podstawowe
metody.

1.5

MD5

Funkcja skrótu MD5 została zaprojektowana przez Rona
Rivesta w 1991 roku.

Jej dokładny opis można znaleźć w

RF C1321 [114]. Funkcja generuje 128 bitowy skrót w 4 run-
dach.

Bezpieczny: nie

Powszechnym zastosowaniem MD5 jest generowanie skrótów wszelkiego rodzaju plików udostęp-

nianych publicznie (najczęściej w Internecie), dzięki czemu osoba, która pobrała dany plik z sieci
może od razu zweryfikować (generując skrót MD5 na swojej kopii i porównując wyniki) czy jest
to ten sam plik który został zamieszczony przez jego autora lub czy nie nastąpiły przekłamania
podczas samego procesu pobierania danych. Publikowana w takim przypadku wartość ma postać
32-znakowej liczby w zapisie szesnastkowym.

Algorytm MD5 jest następujący:

1. Doklejamy do wiadomości wejściowej bit o wartości 1

2. Doklejamy tyle zer ile trzeba żeby ciąg składał się z 512-bitowych bloków, i ostatniego

niepełnego – 448-bitowego

3. Doklejamy 64-bitowy (zaczynając od najmniej znaczącego bitu) licznik oznaczający rozmiar

wiadomości. W ten sposób otrzymujemy wiadomość złożoną z 512-bitowych fragmentów.

4. Ustawiamy stan początkowy na 0123456789abcdef f edcba9876543210

5. Uruchamiamy na każdym bloku (jest przynajmniej jeden blok nawet dla pustego wejścia)

funkcję zmieniającą stan

6. Po przetworzeniu ostatniego bloku zwracamy stan jako obliczony skrót wiadomości

Funkcja zmiany stanu ma 4 cykle (64 kroki). Stan jest traktowany jako 4 liczby 32-bitowe, i w
każdym kroku do którejś z tych liczb dodawany jest jeden z 16 32-bitowych fragmentów bloku
wejściowego, pewna stała zależna od numeru kroku oraz pewna prosta funkcja boolowska trzech
pozostałych liczb. Następnie liczba ta jest przesuwana cyklicznie o liczbę bitów zależną od kroku,
oraz jest dodawana do niej jedna z pozostałych liczb.

5

background image

Bezpieczeństwo
MD5 jest udoskonaloną wersją funkcji MD4, która okazała się nieodpowiednia do zastosowań kryp-
tograficznych. MD4 poddała się kryptoanalizie dwóch z trzech cykli [42], a w 2004 roku została
zaprezentowana skuteczna metoda generowania kolizji [65] o złożoności zaledwie O(2

8

).

W 2004 roku chińscy naukowcy na których czele stała Xiaoyun Wang opublikowali wyniki anal-
itycznego algorytmu ataku na MD5 dla dwublokowych wiadomości o złożoności O(2

39

), który

pozwalał wygenerować kolizję w godzinę działania klastrowego komputera IBM P690 [56]. Idea
algorytmu Wang opierała się na założeniu, że mamy kolidującą ze sobą parę wiadomości (M, N )
i (M

0

, N

0

), złożoną z dwóch bloków (dwóch wiadomości). Pierwszy blok różni się tylko predefin-

iowanym stałym wektorem C

1

(M

0

= M + C

1

), oraz drugi blok różni się tylko predefiniowanym

stałym wektorem C

2

= −C

1

mod 2

32

(N

0

= N + C

2

).Wówczas M D5(M ||N ) = M D5(M

0

||N

0

).

Szczegóły algorytmu zostały jednak przez nich ukryte. Po publikacji efektów prac Wang, Hawkes [55]
częściowo zrekonstruował algorytm wykorzystany przez Wang. Jednak jego algorytm był znacznie
bardziej złożony obliczeniowo aniżeli algorytm Wang. W 2005 roku Arjen Lenstra, Xiaoyun Wang,
oraz Benne de Weger [66] zademonstrowali praktyczne łamanie dwublokowej funkcji skrótu na
dwóch X.509 certyfikatach z różnymi kluczami publicznymi, oraz tym samym skrótem MD5. Kilka
dni później Klima [67] usprawnił zaprezentowany algorytm o złożoności O(2

33

), tak aby mógł gen-

erować kolizję w przeciągu kilku godzin na standardowym komputerze. W 2006 roku ponownie
usprawnił algorytmu, korzystając z ‘tunelowania w funkcji skrótu’ O(2

26

), tak że mógł generować

kolizję w przeciągu kilku sekund [71, 115]. W 2004 roku Ondrej Mikle pokazał [53], że pojedyncza
kolizja jest wystarczająca aby stworzyć parę różnych samo-rozpakowujących się archiwów z identy-
cznymi skrótami. Takie mechanizmy mogą już wykorzystywać wirusy, aby modyfikować chronione
pliki.

Algorytmu nie powinno się używać do zastosowań kryptograficznych [69, 70, 78]. Nie powinien

być także wykorzystywany do generowania sum kontrolnych.

Interfejs udostępniony przez bibliotekę
Klasa MD5 dziedziczy po abstrakcyjnej klasie Hash, udostępniając tym samym podstawowe
metody.

1.6

RIPEMD

Pierwsza, 128 bitowa funkcja skrótu RIPEMD została opra-
cowana w ramach projektu RIPE (RACE Integrity Primitives
Evaluation), realizowanego w latach 1988-1992 i finansowanego
przez Wspólnotę Europejską. Jej dokładny opis można znaleźć
w R1040 [21]. Algorytm zaprojektowali Hans Dobbertin, An-
toon Bosselaers i Bart Preneel. Funkcja generuje 128 bitowy
skrót w 4 rundach.

Bezpieczny: nie

RIPEMD-160 została zaprojektowana przez Hans Dobbertin,
Antoon Bosselaers, oraz Bart Preneel [42] w 1996 roku. Funkcja
generuje 160 bitowy skrót w 5 rundach w dwóch niezależnych
gałęziach.

Bezpieczny: **

Pierwsza, 128 bitowa funkcja skrótu RIPEMD została opracowana w ramach projektu RIPE

(RACE Integrity Primitives Evaluation), realizowanego w latach 1988-1992 i finansowanego przez
Wspólnotę Europejską. Wersja przekształcająca wiadomość o dowolnej długości na 160 bitowy [91]
skrót powstała w roku 1996. Projektantami algorytmu są Hans Dobbertin, Antoon Bosselaers, oraz
Bart Preneel [42].

Bezpieczeństwo
Funkcja 128 bitowa RIPEMD-128, nie jest bezpieczną funkcją do zastosowań kryptograficznych.
Atak kolizji ‘dnia urodzin’ posiada złożoność O(2

64

), co przy dzisiejszej mocy obliczeniowej nie jest

uznawane za bezpieczne, gdyż wygenerowanie kolizji już w 1994 roku zajmowało zaledwie kilka

6

background image

miesięcy [30]. W 2004 roku Xiaoyun Wang, Dengguo Feng, Xuejia Lai i Hongbo Yu przedstaw-
ili analityczną metodę łamania pierwszej wersji RIPE-MD [56], lecz utajnili większość szczegółów
swojej pracy. Funkcja RIPEMD160 do dnia dzisiejszego oficjalnie nie poddała się skuteczne krypto-
analitykom. Istnieją także wersje generujące 256 i 320 bitowe skróty, ale nie zapewniają one więk-
szego poziomu bezpieczeństwa aniżeli RIPEMD-160.

Interfejs udostępniony przez bibliotekę
Klasy RIPEMD128, oraz RIPEMD160 dziedziczą po abstrakcyjnej klasie Hash, udostępniając
tym samym podstawowe metody.

1.7

HAVAL

Funkcja skrótu HAVAL została zaprojektowana w 1992 roku
przez Yuliang Zheng, Josef Pieprzyk i Jennifer Seberry [24]. W
bibliotece została zaimplementowane funkcje skrótu generujące
128, 160 i 256 bitowe skrotu w 5 cyklach.

Bezpieczny: **

HVAL [24] jest funkcją skrótu wytwarzającą skrót o zmiennej długości. W bibliotece zaimple-

mentowane zostały 5-cyklowe funkcję skrótu HAVAL wytwarzające skróty o długościach 128, 160
lub 256 bitów. Algorytm jest odmianą MD4, zaprojektowanym tak, aby był bezpieczniejszy.

Bezpieczeństwo
Algorytm HAVAL przetwarza wiadomości 1024 bitowymi blokami. Zaimplementowana wersja al-
gorytmu wykonuje operacje przez 5 cykli a każdy cykl składa się z 16 kroków. Proste funkcje
nieliniowe występujące w algorytmie MD5 zostały zastąpione w algorytmie HAVAL bardzo nielin-
iowymi funkcjami siedmiu zmiennych i każda z nich spełnia dokładnie wymagania lawinowości. W
każdym cyklu jest używana jedna funkcja, lecz w każdym kroku jest stosowana inna permutacja
ciągu wejściowego. W 2003 została zaprezentowana praktyczna metoda łamania algorytmu HAVAL
(wersja z 3 cyklami) o złożoności obliczeniowej O(2

29

) [51]. Niedługo po tym zostaje zaprezen-

towana metoda łamania algorytmu HAVAL (wersja z 3 cyklami) w czasie zaledwie O(2

6

) [56]. W

2006 roku została przedstawiona metoda łamania 4 cyklowego algorytmu HAVAL o pesymistycznej
złożoności obliczeniowej 2

32

[75]. Taka złożoność obliczeniowa umożliwiła spowodowanie kolizji w

czasie kilku godzin na zwykłym PC. Aktualnie najefektywniejszy atak na 5 rundowy algorytm
HAVAL posiada złożoność obliczeniową wynoszącą O(2

123

) [74].

Interfejs udostępniony przez bibliotekę
Klasa HAVAL dziedziczy po abstrakcyjnej klasie Hash, udostępniając tym samym podstawowe
metody.

1.8

GostHash

Funkcja skrótu GOST została zaprojektowana w Związku
Radzieckim w 1990 roku.

Jej dokładny opis można znaleźć

w GOST R 34.11–97 [31]. Funkcja generuje 256 bitowy korzys-
tając z S-boxów.

Bezpieczny: **

256 bitowa funkcja skrótu GOST jest częścią standardu GOST R 34.11–97 [31]. Standard został

zaprojektowany i wdrożony w Związku Radzieckim. Po rozpadzie Związku Radzieckiego kilka kra-
jów przyjęło standard GOST jako narodowy standard kryptograficzny; Rosja, Białoruś, Ukraina,
Mołdawia, Kazachstan, Azerbejdżan, Armenia, Kirgistan, Uzbekistan, Tadżykistan, Gruzja, Turk-
menistan.

Bezpieczeństwo
Nie są znane dotychczas metody łamania funkcji skrótu GOST, co nie oznacza, że ich nie ma.
Standard opisujący funkcję skrótu liczy sobie ponad 18 lat.

7

background image

Interfejs udostępniony przez bibliotekę
Klasa GostHash dziedziczy po abstrakcyjnej klasie Hash, udostępniając tym samym podstawowe
metody.

1.9

FORK-256

Funkcja skrótu FORK-256 została zaprojektowana w 2006 roku
przez D. Hong, D. Chang, J. Sung, S. Lee, S. Hong, J. Lee, D.
Moon, oraz S. Chee [76, 81, 79]. Funkcja generuje 256 bitowy
skrót bazując na 4 niezależnych gałęziach obliczeń.

Bezpieczny: ***

Grupa Koreańczyków pod przewodnictwem Deukjo Hong na konferencji FSE (Fast Software En-

cryption) [76] w roku 2006 przedstawiła funkcję skrótu bazującą na idei zaczerpniętej z RIPEMD-
160 [42], gdzie przekształcenia dokonywano w dwóch niezależnych gałęziach. Koreańczycy wyko-
rzystali 4 gałęzie niezależnych obliczeń, uzyskując przy tym funkcję wydajniejszą niż SHA-256 [44].

Bezpieczeństwo
Podejście niezależnych gałęzi powoduje, że podczas łamania takiej funkcji nie tylko bierze się pod
uwagę złożoność czasową, ale także pamięciową, co powoduje, że funkcje skrótu bazujące na nieza-
leżnych gałęziach są bezpieczniejsze od standardowych funkcjach skrótu, których bezpieczeństwo
opiera się wyłącznie na złożoności czasowej. W roku 2007 roku Matusiewicz , Peyrin, Billet, Contini
i Pieprzyk [80] zaprezentowali algorytm łamiący funkcję skrótu FORK-256 w czasie O(2

109

), oraz

posiadający złożoność pamięciową równą O(2

73

) a także algorytm o złożoności czasowej O(2

125

)

i nie wymagający pamięci. Thomas Peyrin i Olivier Billet [89] kilka miesięcy później polepszyli
algorytm łamiący FORK-256 do O(2

106

) złożoności czasowej i O(2

64

) pamięciowej. Algorytm jed-

nak nadal można uważać za bezpieczny do zastosowań kryptograficznych.

Interfejs udostępniony przez bibliotekę
Klasa FORK256 dziedziczy po abstrakcyjnej klasie Hash, udostępniając tym samym podstawowe
metody.

1.10

SHA

SHA (Secure Hash Algorithm) – rodzina powiązanych ze sobą
funkcji skrótu zaprojektowanych przez NSA (National Security
Agency) i publikowanych przez National Institute of Standards
and Technology [44]. W bibliotece zostały zapimplementowane
funkcje skrótu z rodziny SHA generujące 160, 256, oraz 512
bitowe skróty.

Bezpieczny:

SHA-0

(nie),

SHA-1

(*),

SHA-2 (**)

Pierwsza funkcja skrótu z rodziny SHA została opublikowany w 1993 oficjalnie nazwana SHA

(nieoficjalnie, żeby nie pomylić z następcami określana jako SHA-0). Algorytm SHA-1 [110] (160
bitowy) opublikowany został w 1995 i całkowicie zastąpił wycofanego (ze względu na nieujawnione
oficjalnie wady) z użytku SHA-0 [64]. Potem od 2001 powstały cztery następne warianty określane
jako SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512). Podstawowym celem publikacji SHA był
Standard Podpisu Cyfrowego (Digital Signature Standard) [34], którego SHA był częścią.

Bezpieczeństwo
W 2004 zgłoszono udane ataki na funkcje skrótu [56] mające strukturę podobną do SHA-1 [110]
co podniosło kwestię długotrwałego bezpieczeństwa SHA-1. NIST ogłosił, że do 2010 zaprzestanie
stosować SHA-1 na rzecz różnych wariantów SHA-2. SHA-0 i SHA-1 tworzą 160-bitowy skrót z
wiadomości o maksymalnym rozmiarze 2

64

bitów i jest oparty o podobne zasady co MD5 [114]. W

roku 2002 za pomocą serwisu distributed.net i internautów po raz pierwszy został złamany SHA-1.
W 2005 roku Xiaoyun Wang, Yiqun Lisa Yin, Hongbo Yu z Shandong University w Chinach przed-
stawili interesującą metodę łamania SHA-1 [63] o złożoności O(2

69

). Po roku Adi Shamir, oraz jego

studenci ulepszyli algorytm do O(2

63

), a w 2007 roku Martin Cochran opublikował ich prace [86].

W roku 2006 na konferencji ASIACRYPT Christian Rechberger i Christophe De Canni´

ere [73]

8

background image

zaprezentowali nową klasę ataku na SHA-1, która umożliwia atakującemu wybranie fragmentów
tekstu jawnego – jest to pierwszy krok do fałszowania dokumentów podpisanych przy pomocy
tej funkcji skrótu. Fałszowanie dokumentów jest możliwe w sytuacji, gdy dla istniejącego doku-
mentu oraz jego skrótu jest możliwe wygenerowanie innego dokumentu, dającego identyczny skrót.
Nowy atak częściowo to umożliwia, ponieważ atak narzuca około 75% treści kolidującego pliku,
zaś pozostałe 25% może być wybrane przez atakującego – czyli może zawierać na przykład nieko-
rzystną dla ofiary treść. Nasuwa się pytanie; co zrobić ze “śmieciami” stanowiącymi pozostałą część
dokumentu? Nie jest to jednak problemem, gdyż większość współczesnych formatów dokumentów
umożliwia przechowywanie dowolnej treści “jałowej”, jak na przykład komentarze w HTML lub
XML. Zaprezentowany na konferencji mechanizm ma zastosowanie dla SHA-1 zredukowanego do
64 rund, ale według autorów może być z łatwością rozszerzony na pełną wersję z osiemdziesię-
cioma rundami. Złożoność O(2

63

), oraz możliwość podrabiania dokumentów podpisanych przy

użyciu SHA-1 ostatecznie przesądziła o bezpieczeństwie SHA-1, który nie jest już uznawany za
bezpieczny do zastosowań kryptograficznych. W 2003 roku na konferencji SAC Gilbert i Hand-
schuh [54] przedstawili algorytm łamiący z prawdopodobieństwem 2

−66

rodzinę funkcji SHA-2.

Praca Philip Hawkes, Michael Paddon, oraz Gregory Rose [82] może sugerować, że SHA-2 nie jest
bezpieczny, ale wymaga dalszych badań.

Interfejs udostępniony przez bibliotekę
Klasy SHA160, SHA256, SHA512 dziedziczą po abstrakcyjnej klasie Hash, udostępniając tym
samym podstawowe metody.

1.11

Whirlpool

Funkcja skrótu Whirlpool została zaprojektowana w 2003 roku
przez Vincent Rijmen i Paulo Barreto [109]. Funkcja generuje
512 bitowy skrót korzystając z S-boxów.

Bezpieczny: ***

512 bitowa funkcja skrótu Whirlpool [109] została opracowana przez Vincent Rijmen (współtwórcy

Advanced Encryption Standard), oraz Paulo S. L. M. Barreto. Funkcja jest oparta o algorytm
Miyaguchi-Preneel budowania funkcji skrótu, oraz mocno zmodyfikowany algorytm szyfrowania
blokowego Rijmen (AES).

Bezpieczeństwo
Nie są znane dotychczas metody łamania funkcji skrótu Whirlpool.

Interfejs udostępniony przez bibliotekę
Klasa Whirlpool dziedziczy po abstrakcyjnej klasie Hash, udostępniając tym samym podstawowe
metody.

1.12

MasterHash

Funkcja skrótu MasterHash została zaprojektowana w 2008 na
potrzeby tej biblioteki.

Funkcja generuje 1024 bitowy skrót

bazując na 128 niezależnych gałęziach obliczeń w której każda
z gałęzi wykorzystuje własny S-box w 32 rundach.

Bezpieczny: ***

Funkcja została zaprojektowana w taki sposób, aby w przypadku generowania kolizji nie tylko

narzucała znaczną złożoność obliczeniową, ale także i pamięciową. Niestety jest kilkukrotnie wol-
niejsza od wszystkich dotychczas omawianych funkcji skrótu.

Bezpieczeństwo
Dzięki strategii w której wykorzystuje się niezależne gałęzie obliczeń jak i niezależne S-boxy praw-
dopodobnie nawet algorytmy kwantowe nie będą w stanie wygenerować kolizji w czasie wielo-
mianowym [61, 50]. Funkcja może zostać wykorzystana tam, gdzie względy bezpieczeństwa są
niezwykle istotne. Funkcja została zaprojektowana wyłącznie na potrzeby tej biblioteki i nie została
przeprowadzona jej dokładna kryptoanaliza. Zastosowane mechanizmy, które zostały zaczerpnięte

9

background image

z najbezpieczniejszych funkcji skrótu mogą sugerować, że funkcja jest jednak bezpieczna.

Interfejs udostępniony przez bibliotekę
Klasa MasterHash dziedziczy po abstrakcyjnej klasie Hash, udostępniając tym samym podsta-
wowe metody.

1.13

Ciąg uwierzytelniania wiadomości

Jednokierunkowa funkcja skrótu zależna od klucza często oznaczana MAC (ang. Message Authen-
tication Code – ciąg uwierzytelnienia wiadomości) [49]. Ciągi uwierzytelnienia wiadomości mają
takie same właściwości jak jednokierunkowe funkcje skrótu, lecz zawierają także klucz. Tylko
znając klucz można zweryfikować skrót. MAC można stosować do uwierzytelniania użytkowników
plików. Może być także stosowany przez jednego użytkownika pliku do sprawdzenia, czy plik nie
był zmieniany, np. przez hackera. Użytkownik pliku oblicza MAC swojego pliku i zapisuje go w
tablicy. Gdyby zastosował tylko jednokierunkową funkcję skrótu, to hacker, po dokonaniu zmian w
pliku, mógłby obliczyć nową funkcję skrótu. Hackerowi nie uda się jednak tego tak prosto dokonać
z MAC, ponieważ nie jest mu znany klucz użytkownika.

Prostym sposobem zmiany jednokierunkowej funkcji skrótu w MAC jest zaszyfrowanie skrótu

algorytmem symetrycznym.

Bezpieczeństwo
Szyfrując skrót nieodpowiednim algorytmem, na przykład stosując DES albo FEAL, możemy
ułatwić złamanie tak utworzonego MAC za pomocą analizy różnicowej [49].

Aby wygenerować MAC nie musimy korzystać z algorytmów szyfrujących. Możemy zastosować

tylko jednokierunkową funkcję skrótu. Jeśli Alice i Bob mają wspólny klucz K i Alice chce wysłać
Bobowi MAC dla wiadomości M , to dokonuje konkatenacji K oraz M i oblicza wartość jednok-
ierunkowej funkcji skrótu dla tej konkatenacji H(K, M ). Otrzymany skrót stanowi MAC. Ponieważ
Bob zna klucz K, może odtworzyć wynik, który otrzymała Alice. Możemy także z kluczem K
konkatenować obliczoną funkcję skrótu wiadomości M .

Należy pamiętać o tym, że odbiorca musi znać klucz i wszelkie związane z tym problemy z

bezpieczeństwem kluczy. Gdy odbiorca zna klucz, może także wygenerować wiadomość z tym
samym skrótem jak wiadomość przez jej rozszyfrowanie w odwrotnej kolejności i wykorzystać w
złych zamiarach.

MAC samo w sobie nie zapewnia bezpieczeństwa i zależy w znacznym stopniu od bezpieczeństwa

użytej funkcji skrótu. Philip Hawkes [55] pisał o algorytmach łamania MAC z MD5 w czasie
O(2

128

), oraz w czasie O(2

42

) kiedy znamy klucz.

Interfejs udostępniony przez bibliotekę
Biblioteka udostępnia metody generujące MAC przy pomocy wybranej funkcji skrótu jak i wybranego
algorytmu szyfrującego (może być z już ustawionym kluczem, wtedy nie musimy przekazywać w
parametrze dodatkowo klucza) lub przy pomocy samego klucza.

10

background image

Metody z klasy abstrakcyjnej Hash tworzą ciągi uwierzytelnienia wiadomości.

const void ∗ Hash : :MAC( C i p h e r & ) ;
const void ∗ Hash : :MAC( C i p h e r &, const void ∗ key , unsigned l e n g t h ) ;
const void ∗ Hash : :MAC( const void ∗ key , unsigned l e n g t h ) ;

MAC(Cipher&)

Metoda jako parametr przyjmuje referencję na klasę
reprezentującą algorytm szyfrowania
(koniecznie z już ustawionym kluczem).

MAC(Cipher&, key, length)

Metoda jako parametr przyjmuje referencję na klasę
reprezentującą algorytm szyfrowania, oraz klucz i jego
długość, aby można było przy pomocy przekazanego
klucza zaszyfrować skrót.

MAC(key, length)

Metoda jako parametr przyjmuje klucz, oraz jego
długość. W metodzie nie szyfrujemy skrótu, tylko
konkatenujemy z kluczem.

1.13.1

Przykład użycia

using namespace c r y p t o ;

MD5 md5 ;

AES a e s ;

char b u f o r [ ] = ” j a k i e s dane ” ;
char h a s l o [ ] = ” 0 1 2 3 4 5 6 7 8 9 a b c d e f ” ;

// G e n e r u j ę s k r ó t .

md5 . G e n e r a t e ( b u f o r ,

s t r l e n ( b u f o r ) ) ;

// Tworzę c i ą g

u w i e r z y t e l n i e n i a w i a d o m o ś c i .

md5 .MAC( a e s , h a s l o ,

s t r l e n ( h a s l o ) ) ;

// Wyświetlam c i ą g

u w i e r z y t e l n i e n i a .

cout<<md5 . G e t S t r i n g ( ) ;

1.14

Tęczowe tablice

Na podstawie skrótu (hash wiadomości) nie jesteśmy w stanie odtworzyć hasła, a więc by zła-
mać hasło musimy brać po kolei wszystkie możliwe hasła, tworzyć ich skrót (hash) a następnie
porównywać go ze skrótem hasła które chcemy złamać. W takiej sytuacji możemy wygenerować
na podstawie najczęściej występujących haseł (słownika) ogromną ilość skrótów i sprawdzać, czy
przypadkiem w naszej bazie danych nie istnieje już taki skrót i odczytywać wiadomość która została
użyta do jego wygenerowania.

Jednak plik zawierający taką listę haso−skrt byłby ogromny. Kompromisem między wykorzys-

taniem wcześniej przygotowanych skrótów a oszczędnością miejsca są “tęczowe tablice”. Składają
się one z łańcuchów złożonych z haseł oraz ich skrótów. Generujemy hasło, następnie skrót od tego
hasła, zamieniamy ten skrót za pomocą funkcji redukcyjnej na następne hasło, z którego następnie
wyliczamy jego skrót i tak dalej. W tęczowych tablicach zapisujemy jednak tylko pierwszy i ostatni
element łańcucha (hasło i ostatni skrót) .

W celu odgadnięcia hasła, mając jego skrót, sprawdzam wszystkie dostępne skróty. Jeśli nie odna-

jdę skrótu pasującego do wzorca, to generuje hasło ze skrótu(tego który chcę złamać) za pomocą
funkcji redukcyjnej a następnie jego skrót sprawdzam czy zgadza się z którymś z tablicy porównu-
jąc skróty. Kiedy skrót zostanie w końcu znaleziony, brane jest początkowe hasło z łańcucha w

11

background image

Rysunek 1: Tęczowe tablice

którym skrót się znajdował, a następnie jest redukowane i jest wytwarzany jego skrót aż uzyska
się parę złożoną z hasła, oraz jego skrótu w postaci szukanego skrótu.
W Internecie jest wiele darmowych baz zawierających tęczowe tablice. Istnieje bardzo duże ryzyko,
że w przypadku słabych haseł nawet osoba niedoświadczona jest w stanie “odgadnąć” nasze hasło
na podstawie funkcji skrótu. Dlatego nawet, jeśli nasze hasło zostaje poddane działaniu funkcji
skrótu, należy pamiętać aby było dostatecznie skomplikowane.

2

Algorytmy Kryptografii Symetrycznej

[A5, RC4, Trivium, Salsa20]—[AES, Serpent, Twofish, GOST]—[ MasterCipher]

Kryptografia symetryczna to taki rodzaj szyfrowania, w którym tekst jawny ulega przekształceniu
na tekst zaszyfrowany za pomocą pewnego klucza, a do odszyfrowania jest niezbędna znajomość
tego samego klucza. Szyfry symetryczne dzielą się na szyfry blokowe i szyfry strumieniowe.

2.1

Implementacja

Wszystkie klasy reprezentujące algorytmy kryptografii symetrycznej dziedziczą po abstrakcyjnej
klasie Cipher.

12

background image

c l a s s C i p h e r {

public :

v i r t u a l const char ∗ GetName ( void )

const = 0 ;

v i r t u a l unsigned G e t B l o c k S i z e ( void ) const = 0 ;

v i r t u a l void C l e a r ( void ) = 0 ;

v i r t u a l void SetKey ( const void ∗ key , unsigned s i z e ) = 0 ;

v i r t u a l void Encrypt ( void ∗ data , unsigned s i z e ) = 0 ;
v i r t u a l void Decrypt ( void ∗ data , unsigned s i z e ) = 0 ;

v i r t u a l void Encrypt ( CipherMode & ) ;
v i r t u a l void Decrypt ( CipherMode & ) ;

} ;

GetName

Metoda zwraca nazwę algorytmu kodującego (np. RC4, AES )

GetBlockSize

Metoda zwraca rozmiar bloku wyrażony w bajtach, który
algorytm szyfruje.

Clear

Metoda zwalnia zasoby, oraz usuwa tymczasowe dane.

SetKey

Metoda przyjmuje klucz.

Encrypt

Szyfruje bufor ‘data’ o długości (size)-bajtów
(standardowo w trybie ECB).

Decrypt

Odkodowuje bufor ‘data’ o długości (size)-bajtów
(standardowo w trybie ECB).

Encrypt(CipherMode&)

Szyfruje bufor w wybranym trybie.

Decrypt(CipherMode&)

Odkodowuje bufor w wybranym trybie.

2.1.1

Przykład użycia

c r y p t o : : AES a e s ;

char b u f o r [ ] = ” j a k i e s dane ” ;
char h a s l o [ ] = ” 0 1 2 3 4 5 6 7 8 9 a b c d e f ” ;

// Ustawiam h a s ł o z j a k i m ma d z i a ł a ć a l g o r y t m s z y f r u j ą c y .

a e s . SetKey ( h a s l o ,

s t r l e n ( h a s l o ) ) ;

// S z y f r u j e b u f o r .

a e s . Encrypt ( b u f o r ,

s t r l e n ( b u f o r ) ) ;

// O d s z y f r o w u j e b u f o r .

a e s . Decrypt ( b u f o r ,

s t r l e n ( b u f o r ) ) ;

2.2

Strumieniowe Algorytmy Kryptograficzne.

Opisane przeze mnie algorytmy kryptografii strumieniowej należą do grupy algorytmów symetrycznych,
co oznacza, że tego samego klucza używa się do zaszyfrowania jak i odszyfrowania wiadomości
(odmiennie od kluczy publicznych i algorytmów asymetrycznych, które używają różnych kluczy do
tych operacji). Bezpieczeństwo algorytmów symetrycznych zależy nie tylko od długości klucza i
ataków innych niż brute-force, zależy także od bezpiecznego przechowywania i przesyłania samego
klucza, o czym zawsze należy pamiętać.

13

background image

2.2.1

A5

A5 [33] jest szyfrem strumieniowym z 64 bitowym kluczem.
Opracowanym przez francuzów w latach osiemdziesiątych [49].

Bezpieczny: nie

W latach osiemdziesiątych agencje szpiegowskie państw członkowskich rozważały, czy szyfrowanie

GSM powinno być silne czy słabe. Wtedy też został wybrany francuski algorytm kryptograficzny
A5 (średnio silny) jako standard szyfrowania w telefonii GSM. Szyfrowanie algorytmem A5 jest
stosowane podczas komunikacji pomiędzy aparatem telefonicznym a stacją główną aż do dzisiaj.
Należy zwrócić uwagę, że dane w wewnętrznej sieci operatora telefonii GSM są przesyłane bez
zastosowania kryptografii, umożliwiając łatwe podsłuchiwanie.

Bezpieczeństwo
Co najmniej od roku 1998 istniały proste ataki na szyfr wymagające O(2

40

) szyfrowań, gdzie

należało odgadnąć zawartość dwóch rejestrów i podjąć próbę określenia zawartości trzeciego na
podstawie ciągu strumienia klucza. Krótkie rejestry A5 ułatwiają przeprowadzenie ataku bru-
talnego.

Elad Barkan, Eli Biham, oraz Nathan Keller [52] w 2003 roku opublikowali artykuł

prezentujący skuteczne ataki na algorytmy kryptograficzne używane w GSM, w tym A5. Słabość
algorytmu A5 wykorzystały osoby z grupy THC projektując system mogący skutecznie łamać al-
gorytm A5 [107]. Nadal wielu operatorów używa tego algorytmu, co prawdopodobnie w kolejnych
latach ulegnie zmianie.

Interfejs udostępniony przez bibliotekę
Klasa A5 dziedziczy po abstrakcyjnej klasie Cipher, udostępniając tym samym podstawowe metody.

2.2.2

RC4

RC4 [108, 49] jest szyfrem strumieniowym o zmiennym rozmi-
arze klucza, zaprojektowanym w 1987 roku przez Rona Rivesta
dla firmy RSA Data Security, INC (RSADSI).

Bezpieczny: nie

Szyfr strumieniowy RC4 został zaprojektowany w 1987 roku przez Rona Rivesta. Oficjalnie

nazwa jest akronimem słów “Rivest Cipher 4”. RC4 początkowo był tajemnicą handlową. We
wrześniu 1994 implementacja szyfru w języku C została wysłana anonimowo na listę mailową
Cypherpunks, skąd trafił na grupę dyskusyjną sci.crypt. Od tej pory algorytm nie jest już tajem-
nicą handlową, ale nazwa RC4 nadal jest zastrzeżonym znakiem handlowym. Nieoficjalne imple-
mentacje szyfru są legalne, ale noszą inną nazwę niż RC4 (

,

ARC4łub

,

ARCFOUR”). RC4 spośród

algorytmów strumieniowych jest obecnie najefektywniejszy, dlatego jest używany w wielu pro-
tokołach; między innymi w SSL, WEP czy BitTorrent, oraz powszechnie w produktach Microsoftu.

Bezpieczeństwo
Algorytm używa 8 grup po 8 bloków typu S-blok: S

0

, S

1

, . . . , S

255

. Ich ciągami wejściowymi są

permutacje liczb od 0 do 255, a permutacje te są funkcją klucza o zmiennej długości. Długość
klucza jest wyznaczona poprzez liczbę bajtów w kluczu, która typowo wynosi pomiędzy 5 a 16
bajtów (pomiędzy 40 a 128 bitów). Algorytm jest odporny na kryptoanalizę liniową i różnicową,
nie ma krótkich cykli i jest bardzo nieliniowy. Algorytm RC4 może znajdować się w jednym z
(256!x256

2

) możliwych stanów.

W 2000 roku Fluhrer i McGrew [45] zauważyli, że pewne sekwencje bajtów pojawiają się niez-

nacznie częściej w strumieniu szyfrującym RC4 niż inne. Opracowali atak oparty na tej własności.
Za pomocą tego ataku można wyodrębnić strumień szyfrujący z gigabajta danych. W 2001 roku
Fluhrer, Mantin i Shamir [46] odkryli, że wśród wszystkich możliwych kluczy RC4 rozkład statysty-
czny kilku pierwszych bajtów wyjściowego strumienia szyfrującego jest silnie nielosowy. Analizując
dużą liczbę wiadomości zaszyfrowanych tym samym kluczem, można uzyskać ten klucz. Odkrycie
to pozwoliło na złamanie standardu szyfrowania WEP (”wired equivalent privacy”) używanego w
bezprzewodowych sieciach typu 802.11. Spowodowało to przyspieszony rozwój standardu szyfrowa-
nia WPA, będącego następcą WEP. Istnieje możliwość obrony przed atakiem tego typu. W tym
celu należy odrzucić początkową porcję danych ze strumienia szyfrującego (co najmniej pierwsze
1024 bajty). W 2005 Biham, Granboulan i Nguyen [59] przedstawili dwa nowe i bardzo efektywne

14

background image

algorytmy łamania RC4 o złożoności O(2

8

) i O(2

10

). W 2005 roku Hongjun Wu [58] pokazał jak

w praktyce można łamać RC4 na przykładzie implementacji w produktach Microsoftu (Microsoft
Office: Word, Excel, PowerPoint).

RC4 nie jest już uznawany za bezpieczny. Został zaimplementowany w bibliotece, tylko dlatego,

że kiedyś był popularny. Nie zaleca się jego używanie w przyszłości.

Interfejs udostępniony przez bibliotekę
Klasa RC4 dziedziczy po abstrakcyjnej klasie Cipher, udostępniając tym samym podstawowe
metody.

2.2.3

Trivium

Trivium [62] jest szyfrem strumieniowym z 80 bitowym
kluczem. Został opracowany w 2004 roku przez Christophe De
Canniere i Bart Preneel’e w ramach projektu eSTREAM [105].

Bezpieczny: **

Algorytm Trivium [62] wchodzi w skład profilu eSTREAM [105], gdzie zdobył najwyższe

noty [88] pośród algorytmów sprzętowo orientowanych. Prace nad projektem eSTREAM zostały
rozpoczęte w 2004 roku przez organizacje Unii Europejskiej o nazwie ECRYPT (European Net-
work of Excellence for Cryptology) [106] celem zbadania i opracowania bezpiecznych algorytmów
kryptograficznych oraz protokołów.

Bezpieczeństwo
Trivium korzysta z 288 bitowego wewnętrznego stanu składającego się z trzech rejestrów o różnych
długościach. W każdej rundzie pojedynczy bit przesuwa każdy z trzech rejestrów korzystając z
nieliniowych kombinacji dwóch rejestrów. Trivium korzysta z 80 bitowego wektora inicjalizującego,
który wspólnie z 80 bitowym kluczem ustawia dwa rejestry, następnie wewnętrzny 288 bitowy stan
zostaje aktualizowany celem ustawienia zależności wewnątrz stanu, w taki sposób aby, każdy bit
288 wewnętrznego stanu zależał od klucza oraz wektora inicjalizującego. Do tej pory nie są znane
żadne skuteczne i efektywne metody łamania algorytmu. Cameron McDonald, Chris Charnes,
oraz Josef Pieprzyk [85] przedstawili skuteczne metody łamania uproszczonych wersji algorytmu –
Bivium-A oraz Bivium-B za pomocą algorytmu “MiniStat”. Niestety zarówno uproszczone algo-
rytmy jak i Trivium bazują na podobnych zasadach co może sugerować, że algorytm w przyszłości
może zostać złamany.

Interfejs udostępniony przez bibliotekę
Klasa Trivium dziedziczy po abstrakcyjnej klasie Cipher, udostępniając tym samym podstawowe
metody.

2.2.4

Salsa20

Salsa20 [104, 60] jest szyfrem strumieniowym z 256 bitowym
kluczem. Formalnie został opisany w 2005 roku przez Daniel J.
Bernstein’a [60] w ramach projektu eSTREAM [105].

Bezpieczny: ***

Algorytm wchodzi w skład profilu eSTREAM [105], gdzie zdobył najwyższe noty [88] pośród

algorytmów programowo orientowanych. Prace nad projektem eSTREAM zostały rozpoczęte w
2004 roku przez organizacje Unii Europejskiej o nazwie ECRYPT (European Network of Excellence
for Cryptology) [106] celem zbadania i opracowania bezpiecznych algorytmów kryptograficznych
oraz protokołów.

Bezpieczeństwo
Do tej pory nie są znane żadne skuteczne i efektywne metody łamania algorytmu Salsa20/12 Słab-
sze wersje algorytmu (o mniejszej ilości cykli) doczekały się kilku kryptoanaliz które zaprezentowały
jednak metody o bardzo wysokich współczynnikach. Dużym zagrożeniem dla algorytmu jest atak
oparty na analizie różnic szyfrowanych tekstów; na kryptoanalizie różnicowej (ang. Truncated dif-
ferential cryptanalysis) [32, 103]. Paul Crowley [72] w 2006 roku zaprezentował taki atak na 5

15

background image

rundowy algorytm Salsa20 o złożoności 2

165

, oraz wymagający 2

6

tekstów jawnych. W 2008 roku

Aumasson, Fischer, Khazaei, Meier, oraz Rechberger [90] zaprezentowali atak o złożoności O(2

151

)

na Salsa20/7, oraz atak o złożoności O(2

251

) na Salsa20/8. Do tej pory nie zostały opublikowane

żadne ataki na algorytm Salsa20/12, oraz Salsa20. Algorytm zdaje się spełniać wszelkie normy
bezpieczeństwa i może być używany do szyfrowania tajnych danych.

Interfejs udostępniony przez bibliotekę
Klasa Salsa20 dziedziczy po abstrakcyjnej klasie Cipher, udostępniając tym samym podstawowe
metody. Implementacja w bibliotece troszeczkę różni się od standardu Salsa20, gdyż zrezygnowano
z podstawowego wektora inicjalizującego na rzecz funkcji skrótu.

2.2.5

MasterCipher

Algorytm został zaprojektowany specjalnie na potrzeby tej bib-
lioteki. Kaskadowo szyfruje kilkoma różnymi algorytmami.

Bezpieczny: ***

Algorytm korzysta z połączonych (kaskadowo) najbezpieczniejszych algorytmów blokowych

z odpowiednimi trybami kodowania, oraz algorytmów strumieniowych. Dla każdego algorytmu
generuje inny klucz. Dzięki kilku kluczom i ich mieszaniu powstają bardzo silne zabezpieczenia
oparte na bardzo długim kluczu.

Bezpieczeństwo
Algorytm nie jest zbadany.

Sądząc, po użytych kaskadowo najbezpieczniejszych algorytmach

blokowych i strumieniowych, oraz różnych kluczy wykorzystanych przez poszczególne szyfry, z
pewnością algorytm jest co najmniej tak bezpieczny jak obecnie uznane za najbezpieczniejsze.

Interfejs udostępniony przez bibliotekę
Klasa MasterCipher dziedziczy po abstrakcyjnej klasie Cipher, udostępniając tym samym pod-
stawowe metody.

2.3

Blokowe Algorytmy Kryptograficzne

Szyfr blokowy to algorytm przekształcający porcję tekstu jawnego (niezaszyfrowanego) o określonej
długości na kryptogram (tekst zaszyfrowany) o tej samej długości, przy użyciu podanego przez
użytkownika tajnego klucza. Podczas szyfrowania strumień informacji (bitów) dzielony jest na
bloki o skończonej i określonej długości. Szyfrowanie polega na przekształceniu bloku bitów (tekst
odkryty) w inny blok bitów o tej samej długości (szyfrogram). Blokowe algorytmy szyfrują bloki
o stałej długości (na przykład 128 bitów). Im dłuższy jest blok, tym silniejsze rozproszenie i tym
trudniej jest znaleźć zależności pomiędzy tekstem jawnym i kryptogramem, stanowiące podstawę
kryptoanalizy.

Współczesne szyfry blokowe opierają się na kilkukrotnym naprzemiennym stosowaniu warstwy

liniowej (dyfuzji) i nieliniowej (konfuzji). Pojedyncze zestawienie warstwy podstawiającej i rozprasza-
jącej wraz z operacją dodania podklucza stanowi rundę (cykl) szyfru. Kilkukrotnie powtórzona
wraz z oddzielnym algorytmem generacji podkluczy stanowi cały szyfr. Aktualnie szyfry blokowe
opierają swoje bezpieczeństwo na dwóch algorytmach. Pierwszym z nich jest algorytm miesza-
nia danych (ang. data mixing), drugim, nie mniej istotnym, algorytm generacji podkluczy rund
(ang. key schedule). Potencjalne uchybienie bezpieczeństwa, jakim jest możliwość przeprowadzenia
skutecznego ataku z kluczami zależnymi (ang. related keys attack), skłania projektantów algo-
rytmów blokowych do konstruowania coraz bardziej skomplikowanych algorytmów generacji pod-
kluczy.

Implementacja
Możemy się zastanawiać jak algorytm blokowy o ustalonej i niezmiennej długości bloku mógł
by szyfrować dane o dowolnej długości. Na przykład chcemy zaszyfrować 404 bity wiadomości.
Standardowo algorytm poprawnie zaszyfruje 3 bloki po 128 bity, czyli 384 bity i pozostanie 20 bitów
niezaszyfrowanych. Wyobraźmy sobie, że istnieje jeszcze założenie by szyfrogram miał taką samą

16

background image

długość jak tekst jawny. Implementując bibliotekę dla takiego przypadku została wykorzystana
technika zwana “podkradaniem szyfrogramu”.

Niech przez j zostanie oznaczona liczba bitów niepełnego, ostatniego, bloku którą należy za-

szyfrować. Ponownie zostaje zaszyfrowany (już raz wcześniej zaszyfrowany) pierwszy blok szyfro-
gramu. Następnie zostają wybierane z tego raz jeszcze zaszyfrowanego bloku j początkowych
bitów i są one dodawane modulo dwa do tego ostatniego, 20 bitowego, niepełnego bloku. Zaletą
tego sposobu jest to, że wszystkie bity tekstu jawnego są poddane działaniu algorytmu szyfrującego.

Może się także zdarzyć, że będziemy chcieli zaszyfrować wiadomość krótszą od standardowego

bloku. W takim przypadku moglibyśmy dopełnić wiadomość danymi losowymi i przesłać także
jej długość albo skorzystać z innych algorytmów dopełniających wiadomość. Jednak wszystkie
one zwiększają długość szyfrogramu względem długości tekstu jawnego.

W bibliotece zostało

zastosowane inne rozwiązanie.
Niech przez j zostanie oznaczona liczba bitów tekstu jawnego, który ma zostać zaszyfrowany i
j jest mniejsze od długości bloku. Wówczas zostaje utworzony skrót z hasła które jest użyte
do szyfrowania. Następnie skrót ten jest szyfrowany i zostaje dodanych jego pierwszych j bitów
modulo dwa do tekstu jawnego.

2.3.1

Rijndael (AES)

AES [47] (ang.

Advanced Encryption Standard, nazywany

również Rijandael) to symetryczny szyfr blokowy przyjęty przez
NIST w wyniku konkursu ogłoszonego w roku 1997. Algorytm
szyfruje bloki o długości 128 bitów wykorzystując klucze o dłu-
gości 128, 192 lub 256 bitów. Algorytm szyfruje w 10 cyklach
dla 128 bitowych kluczy, 12 dla 192 bitowych kluczy, oraz w
14 dla 256 bitowych kluczy. Algorytm został opublikowany w
1998 roku przez Joan Daemen i Vincent Rijmen [43, 41].

Bezpieczny: **

W 1997 roku NIST ogłosiło konkurs na algorytm mający być w przyszłości narodowym stan-

dardem kryptografii symetrycznej – AES [102]. Bezpośrednią przyczyną rozpisania konkursu była
niewystarczająca siła algorytmu DES [3].

W roku 1997 organizacja EFF (Electronic Frontier

Foundation) [101] była w stanie złamać wiadomość zakodowaną DES-em w ciągu zaledwie kilku
dni sprzętem o wartości 250 tysięcy dolarów. Obecnie można złamać DES-a jeszcze szybciej i
taniej, bo w przeciągu jednej doby (w jednym z konkursów na złamanie algorytmu DES superkom-
puterowi Deep-Crack oraz 100 000 internautom udało się rozszyfrować wiadomość konkursową w
ciągu 22 godzin i 15 minut). Szacuje się, że obecnie (2008 rok) średni czas łamania wiadomości
zaszyfrowanej za pomocą DES, przy wykorzystaniu sprzętu o wartości 1 miliona USD, wynosi
zaledwie kilka minut.

Do finału konkursu na AES zakwalifikowało się pięć algorytmów szyfrujących (Rijndael, RC6,

Mars, Serpent oraz Twofish), ze szczególnym wskazaniem na algorytm Rijndael. Ostatecznie 2
października 2000 roku ogłoszono wyniki. Zwycięzcą został algorytm Rijn-dael, którego autorami
są belgijscy naukowcy Joan Daemen i Vincent Rijmen [43, 41]. W algorytmie Rijndael możliwe
jest użycie kluczy o długościach 128, 192 i 256 bitów i operowanie on na blokach danych o dłu-
gości 128 bitów (oryginalna specyfikacja Rijndael [41] dopuszczała również bloki 192- i 256-bitowe).

AES [47] jest obecnie jednym z najpopularniejszych a zarazem bezpiecznym szyfrem blokowym.

Jego użycie zalecają nie tylko niezależni specjaliści, NIST, ale także NSA, która w 1997 roku uznała,
że Rijndael może być używany do szyfrowania i przesyłania poufnych danych. O popularności AES
może świadczyć fakt, że w 2008 roku firma Intel rozszerzyła zbiór instrukcji SSE o specjalne in-
strukcje wspomagające algorytm AES. Znacznie przyspieszy to operacje związane z szyfrowaniem i
możemy się spodziewać, że powszechnie dane będą szyfrowana przez system w czasie rzeczywistym.

Bezpieczeństwo
AES wykonuje 10 (klucz 128 bitów), 12 (klucz 192 bity) lub 14 (klucz 256 bitów) rund szyfrują-
cych (substitution-permutation). Składają się one z substytucji wstępnej, permutacji macierzowej
(mieszanie wierszy, mieszanie kolumn) i modyfikacji za pomocą klucza. Funkcja substytucyjna

17

background image

ma bardzo oryginalną konstrukcję, która uodparnia ten algorytm na znane ataki kryptoanalizy
różnicowej i liniowej. Odmiany algorytmu Rijndael niebędące standardem AES [47], w zależności
od długości klucza i bloku danych wykonują 12 lub 14 rund szyfrujących. W 2002 roku Nico-
las Courtois i Josef Pieprzyk [48] opublikowali teoretyczny algorytm w którym opisali atak XSL
w którym pokazali, że złożoność algorytmu łamiącego AES nie rośnie wykładniczo wraz z liczbą
cykli. Jeśli algorytm jest poprawny, na pewno można go przyspieszyć do O(2

80

). Co oznacza, że

organizacje pokroju NSA, dysponujące ogromną mocą obliczeniową są w stanie złamać algorytm
prawdopodobnie w czasie krótszym niż rok.

Interfejs udostępniony przez bibliotekę
Klasa AES dziedziczy po abstrakcyjnej klasie Cipher, udostępniając tym samym podstawowe
metody.

2.3.2

Serpent

Serpent [93] jest bardzo bezpiecznym blokowym algorytmem
szyfrującym.

Operuje on na blokach danych o długości 128

bitów i wymaga kluczy o długościach do 256 bitów, przy czym
najczęściej stosowane są klucze o długości 128, 192 oraz 256
bitów. Algorytm szyfruje w 32 rundach. Algorytm został op-
ublikowany w 1998 roku przez Ross Anderson, Eli Biham, oraz
Lars Knudsen.

Bezpieczny: **

Serpent [93] jest uznawany za jeden z najbezpieczniejszych algorytmów blokowych. Jako jeden z

pięciu algorytmów szyfrujących został zakwalifikowany do finału konkursu na AES [102], który os-
tatecznie został wygrany przez algorytm Rijndael [47]. Serpent dostał najmniej negatywnych opinii
ze wszystkich algorytmów nadesłanych na konkurs AES [102]. Algorytm został opublikowany w
1998 roku przez Ross Anderson, Eli Biham, oraz Lars Knudsen [40].

Bezpieczeństwo
Algorytm szyfruje 128 bitowe bloki wykorzystując klucze o długościach do 256 bitów. Najczęściej
stosowane są klucze 128, 192, oraz 256 bitowe. Serpent szyfruje w 32 cyklach słowa o długości 32
bitów. Nie są znane żadne praktyczne metody złamania algorytmu. W 2002 roku Nicolas Cour-
tois i Josef Pieprzyk [48] opublikowali teoretyczny algorytm w którym opisali atak XSL w którym
pokazali, że złożoność algorytmu łamiącego Serpent nie rośnie wykładniczo wraz z liczbą cykli.
Algorytm szyfruje w 32 rundach (AES tylko 14), co daje mu znaczny margines bezpieczeństwa.

Interfejs udostępniony przez bibliotekę
Klasa Serpent dziedziczy po abstrakcyjnej klasie Cipher, udostępniając tym samym podstawowe
metody.

2.3.3

Twofish

Twofish [100] to symetryczny, blokowy algorytm szyfrujący ope-
rujący na blokach danych o długości 128 bitów i wykorzystujący
klucze o długościach od 128 do 256 bitów, przy czym najczęś-
ciej stosowane są klucze o długościach 128, 192 oraz 256 bitów.
Twofish szyfruje w 16 cyklach, niezależnie od długości klucza.
Algorytm został opublikowany w 1998 roku.

Bezpieczny: **

Twofish [100] jako jeden z pięciu algorytmów szyfrujących został zakwalifikowany do finału

konkursu na AES [102], który ostatecznie został wygrany przez algorytm Rijndael [43]. Algorytm
został opublikowany w 1998 roku przez Bruce Schneier, John Kelsey, Doug Whiting, David Wag-
ner, Chris Hall, oraz Niels Ferguson. Twofish bazuje na zaproponowanym przez Bruce Schneier’a,
algorytmie Blowfish [98]. Blowfish jest szyfrem blokowym z 64-bitowym blokiem i kluczem o zmien-
nej długości. Algorytm Blowfish posiadał kilka wad, takich jak “słabe klucze” [97], których użycie
jednak jest wysoce nieprawdopodobne 2

−14

. Także atak za pomocą kryptoanalizy różnicowej był

18

background image

skuteczny na warianty algorytmu o niewielkiej liczbie cykli (nieskuteczny na szyfr Blowfish z 16
cyklami). Twofish nie posiada wad swojego poprzednika. Twofish jest popularnym, a zarazem
bezpiecznym szyfrem blokowym. Jest wykorzystywany przez bardzo wiele aplikacji [99].

Bezpieczeństwo
Algorytm korzysta z 128 bitowych bloków, oraz 128, 196 lub 256 bitowych kluczy. Algorytm składa
się z 16 rund, a do obliczeń w każdej rundzie wykorzystuje tzw. sieć Feistela [96]. Sieć Feistela
pozwala na szyfrowanie i deszyfrowanie informacji tym samym algorytmem, mimo iż funkcja szyfru-
jąca nie jest odwracalna. Sieć Feistela generuje z tekstu jawnego szyfrogram, a z szyfrogramu tekst
jawny. W ten sposób konstruowanie algorytmów szyfrujących znacznie się uprościło, ponieważ nie
trzeba się troszczyć o odwracalność funkcji szyfrującej. Podobnie jak algorytm Blowfish, Twofish
jest oparty na S-Box’ach i rozszerzaniu klucza. Algorytm wykorzystuje także dwustronną trans-
formatę Hadamard’a (Pseudo-Hadamard transform) [95].

Shino Moriai i Yiqun Lisa Yin w 2000 roku złożyli raport w którym (oficjalnie raport został

przedstawiony w 2007 roku) zaproponowali atak [83] oparty na analizie różnic szyfrowanych tek-
stów; na kryptoanalizie różnicowej (Truncated differential cryptanalysis) [32, 94], który przeprowadzili
na pełnym 16 rundowym algorytmie Twofish. Zaproponowany przez nich algorytm potrzebuje 2

51

tekstów jawnych i działa z prawdopodobieństwem 2

−57

na blok by znaleźć dobrą parę tekst jawny-

szyfrogram.

Interfejs udostępniony przez bibliotekę
Klasa Twofish dziedziczy po abstrakcyjnej klasie Cipher, udostępniając tym samym podstawowe
metody.

2.3.4

GOST 28147-89

GOST [14, 27] jest algorytmem szyfrującym operującym na
blokach danych o długości 64 bitów i korzystającym z 256
bitowych kluczy. Algorytm szyfruje w 32 rundach. Algorytm
został opracowany w byłym Związku Radzieckim w latach 70.
Obecnie nadal jest standardem kryptograficznym w kilku kra-
jach byłego Związku Radzieckiego.

Bezpieczny: *

Standard i szyfr blokowy GOST został zaprojektowany i wdrożony w Związku Radzieckim

(GOST 28147-89 [14]) w 1990 roku. Algorytm blokowy GOST 28147-89 jest częścią tego stan-
dardu. Po rozpadzie Związku Radzieckiego kilka krajów przyjęło standard GOST jako narodowy
standard kryptograficzny; Rosja, Białoruś, Ukraina, Mołdawia, Kazachstan, Azerbejdżan, Arme-
nia, Kirgistan, Uzbekistan, Tadżykistan, Gruzja, Turkmenistan. GOST został zaprojektowany
w latach siedemdziesiątych i początkowo był stosowany do szyfrowania informacji wysokiej klasy
tajności. Standard GOST dla ZSSR był tym samym co standard DES dla USA. Należy zauważyć,
że w opisie standardu GOST nie podano, jak są generowane S-bloki, lecz podano, że są one dostar-
czane [14]. Zaowocowało to spekulacjami, że odpowiednie organizacje radzieckie dostarczały “do-
brych” S-bloków dla właściwych organizacji i “słabych” S-bloków dla organizacji, które mogą być
podsłuchiwane [39].

Przykład prawdopodobnie “silnych” S-bloków.

4, 10,

9,

2, 13,

8,

0, 14,

6, 11,

1, 12,

7, 15,

5,

3

14, 11,

4, 12,

6, 13, 15, 10,

2,

3,

8,

1,

0,

7,

5,

9

5,

8,

1, 13, 10,

3,

4,

2, 14, 15, 12,

7,

6,

0,

9, 11

7, 13, 10,

1,

0,

8,

9, 15, 14,

4,

6, 12, 11,

2,

5,

3

6, 12,

7,

1,

5, 15, 13,

8,

4, 10,

9, 14,

0,

3, 11,

2

4, 11, 10,

0,

7,

2,

1, 13,

3,

6,

8,

5,

9, 12, 15, 14

13, 11,

4,

1,

3, 15,

5,

9,

0, 10, 14,

7,

6,

8,

2, 12

1, 15, 13,

0,

5,

7, 10,

4,

9,

2,

3, 14,

6, 11,

8, 12

Przykład “silnych” S-bloków pochodzi z zawartości S-bloków stosowanych w Banku Centralnym
Federacji Rosyjskiej. Te same S-bloki są stosowane jednokierunkowych funkcjach skrótu zalecanych

19

background image

Rysunek 2: Jak ważne jest stosowanie odpowiedniego trybu kodowania może zilustrować poniższe
obrazki (tryb ECB/CBC)

przez GOST [31].

Bezpieczeństwo
Algorytm szyfruje 64 bitowe bloki korzystając z 256 bitowego klucza. Algorytm szyfruje w 32
rundach. Algorytm wykorzystuje sieć Feistela [96].
W przypadku korzystania ze “złych” S-bloków szyfr może zostać złamany prawdopodobnie w sto-
sunkowo szybkim czasie [38], mniejszym od O(2

32

), co w przypadku współczesnej kryptografii

jest niedopuszczalne. Jeśli S-bloki są znane algorytm może zostać złamany w czasie O(2

32

) [39].

W przypadku jeśli S-bloki są “dobre” i nie są znane czas złamania algorytmu wydłuża się do
O(2

63

) [84]. Jednak nawet jeśli S-bloki są ukryte w chipie istnieje wiele technik aby je odczytać.

W takiej sytuacji musimy założyć, że czas potrzebny do złamania GOST jest rzędu O(2

32

), co oz-

nacza, że przy wykorzystaniu sprzętu o wartości 1 miliona USD (2008 rok), szyfr możemy złamać
w zaledwie kilka sekund.

Interfejs udostępniony przez bibliotekę
Klasa GOST dziedziczy po abstrakcyjnej klasie Cipher, udostępniając tym samym podstawowe
metody.

2.4

Tryby Kodowania

Ponieważ wiadomości jakie chcemy zakodować są zwykle znacznie większe od rozmiaru bloku,
musimy używać jakiegoś trybu kodowania (ang. block cipher modes of operation) [92]. Najbardziej
naiwne podzielenie wiadomości na bloki odpowiednich rozmiarów i zakodowanie osobno każdego z
nich (ECB) nie zapewnia nam bezpieczeństwa . W związku z tym szyfry blokowe prawie zawsze
stosuje się w jakimś trybie. Tryb szyfru blokowego jest algorytmem określającym jak szyfrowane są
kolejne bloki tekstu jawnego i jak są one powiązane z poprzedzającymi lub następującymi blokami.

20

background image

2.4.1

Implementacja

c l a s s CipherMode {

public :

const char ∗ GetName ( void ) const ;

void C l e a r ( void ) ;

void SetIV ( void ∗ data , unsigned s i z e ) ;
const void ∗ GetIV ( unsigned ∗ s i z e ) ;

void S e t B u f ( void ∗ data , unsigned s i z e ) ;
void ∗ GetBuf ( unsigned ∗ s i z e ) ;

} ;

GetName

Metoda zwraca nazwę trybu kodowania (np. CBC, CFB )

Clear

Metoda zwalnia zasoby, oraz usuwa tymczasowe dane.

SetIV

Metoda zapamiętuje wskaźnik na blok pamięci przechowujący
wektor inicjalizacyjny.

GetIV

Metoda zwraca adres na wektor IV o ile został ustawiony.

SetBuf

Metoda zapamiętuje adres bloku pamięci który będzie
kodowany, oraz jego rozmiar.

GetBuf

Metoda zwraca adres bloku pamięci, który podlega działaniu
trybu szyfrowania i został ustawiony przy pomocy metody ‘SetBuf ’.

Klasa posiada zablokowany konstruktor kopiujący i operator przypisania.

W przypadku, gdy długość kodowanego obszaru pamięci nie jest podzielna przez długość bloku,

wówczas zostaje dopełniony ostatni blok metodą podkradania szyfrogramu. W związku z tym
wszystkie bity tekstu jawnego są poddawane działaniu algorytmu szyfrującego.

Jeśli długość

kodowanego obszaru pamięci jest krótsza aniżeli długość bloku, wówczas zostaje przekazany adres
na ten obszar pamięci bezpośrednio do algorytmu szyfrowania, który z założenia jest zabezpiec-
zony na taką ewentualność. Użytkownik przed rozpoczęciem szyfrowania w trybie blokowym musi
zapamiętać adres i rozmiar bloku pamięci, który będzie kodowany (CipherM ode :: SetBuf ), oraz
ustawić hasło w wybranym algorytmie szyfrującym (Cipher :: SetKey). Przypisywanie wektora
inicjalizującego nie jest wymagane do poprawnego działania któregokolwiek z algorytmów trybu
blokowego. Jeśli użytkownik nie wybrał wektora inicjalizującego, a algorytm trybu kodowania go
wymaga, cyklicznie wykorzystuje wektor 0123456789abcdef f edcba9876543210.

21

background image

2.4.2

Przykład użycia

c r y p t o : : AES a e s ; // Algorytm s z y f r u j ą c y .
c r y p t o : : CBC c b c ; // Wybrany t r y b .

// P o z o s t a ł e k l a s y ,

k t ó r e

d z i e d z i c z ą po k l a s i e CipherMode t o :

// CFB, OFB i CTR.

char b u f o r [ ] = ” j a k i e s dane ” ;
char h a s l o [ ] = ” 0 1 2 3 4 5 6 7 8 9 a b c d e f ” ;

// Ustawiam h a s ł o z j a k i m ma d z i a ł a ć a l g o r y t m s z y f r u j ą c y .

a e s . SetKey ( h a s l o ,

s t r l e n ( h a s l o ) ) ;

// W o b i e k c i e r e p r e z e n t u j ą c y m t r y b kodowania z a p a m i ę t u j e a d r e s
// b l o k u p a m i ę c i , k t ó r y b ę d z i e s z y f r o w a n y , o r a z j e g o r o z m i a r .

c b c . S e t B u f ( b u f o r ,

s t r l e n ( b u f o r ) ) ;

// S z y f r u j e b u f o r w t r y b i e CBC.

a e s . Encrypt ( c bc ) ;

// O d s z y f r o w u j e b u f o r w t r y b i e CBC.

a e s . Decrypt ( cb c ) ;

2.4.3

ECB

Tryb elektronicznej książki kodowej (z ang. Electronic CodeBook - ECB) to najprostszy tryb
kodowania dużej wiadomości za pomocą szyfrowania blokowego. ECB należy do rodziny trybów
blokowych
. Wiadomość dzielimy na fragmenty odpowiadające wielkości bloku M

1

, M

2

, M

3

, . . . , M

n

i szyfrujemy każdy blok osobno C

i

= E(M

i

). Przesyłanym szyfrogramem jest C

1

, C

2

, C

3

, . . . C

n

.

Dekodowanie jest równie proste M

i

= D(C

i

).

ECB nie zapewnia bezpieczeństwa i nie powinien być nigdy używany. Każdy identyczny frag-

ment danych będzie miał identyczną postać w tekście zaszyfrowanym. Na podstawie relatywnie
prostej analizy można z umiarkowanie dużych ilości tekstu wydobyć zaszyfrowaną wiadomość, jak
to ma miejsce na załączonym obrazku

Implementacja
Ten najprostszy tryb jest używany w algorytmach symetrycznych gdy korzystamy z podstawowych
metod odpowiedzialnych za szyfrowanie.

void C i p h e r : : Encrypt ( void ∗ data , unsigned s i z e ) ;
void C i p h e r : : Decrypt ( void ∗ data , unsigned s i z e ) ;

2.4.4

CBC

Tryb wiązania bloków zaszyfrowanych (ang. Cipher Block Chaining) – tryb kodowania wiado-
mości za pomocą szyfru blokowego, w którym przed zaszyfrowaniem każdy z bloków wiadomości
jest przekształcany funkcją XOR z szyfrogramem uzyskanym z szyfrowania poprzedniego bloku
wiadomości. CBC należy do rodziny trybów blokowych. Pierwszy blok wiadomości jest szyfrowany
za pomocą wylosowanego ciągu bitów (IV – initial vector) dołączanego do wiadomości. Wzór dla
kodowania C

i

= E(P

i

⊕ C

i−1

), gdzie C

0

= IV . Wzór dla dekodowania P

i

= D(C

i

) ⊕ C

i−1

.

22

background image

Tryb CBC jest jednym z najszerzej wykorzystywanych trybów dla szyfrów blokowych. Jed-

nak w przypadku wystąpienia błędów w transmisji niemożliwe będzie poprawne rozszyfrowanie
bloku, który znajduje się po bloku uszkodzonym. CBC nie zabezpiecza przed celową podmianą,
modyfikacją bloków lub bitów. Dlatego ważne jest podczas szyfrowania zapewnienie ochrony inte-
gralności. Brak zapewnienia ochrony integralności był przyczyną znalezienia poważnych błędów w
protokołach kryptograficznych. Błąd taki znaleziono w wersji pierwszej protokołu SSH, wówczas
brak ochrony integralności oraz błędna konstrukcja pakietów umożliwiały atakującemu wstawianie
własnych danych do zaszyfrowanego strumienia danych. Tryb CBC jest zalecanym trybem dla
algorytmów blokowych.

Implementacja
Klasa CBC dziedziczy po abstrakcyjnej klasie CipherM ode, udostępniając podstawowe metody.

2.4.5

CFB

Tryby blokowe nadają się doskonale do szyfrowania gotowych wiadomości, jednak nie są odpowied-
nia dla szyfrowania strumienia danych asynchronicznych, np. wprowadzanych z klawiatury lub
pojawiających się w protokołach komunikacyjnych, w których nie można z góry określić tempa
pojawiania się danych do przesłania (i zaszyfrowania) oraz ich ilości, w efekcie dających teksty
zmiennej długości. W tym celu wprowadzono tryby szyfrowania strumieniowego szyfrujące każ-
dorazowo po jednym znaku 8-bitowym. CFB (ang. Cipher FeedBack) należy do rodziny trybów
sprzężenia zwrotnego
.

Szyfr blokowy używany jest do wygenerowania pseudolosowego ciągu danych, który następnie

pełni role strumienia szyfrującego, mieszanego z danymi za pomocą funkcji XOR. W algorytmie
wybierany jest losowy, jawny blok danych, zwany wektorem inicjującym (IV). Jego długość jest
zależna od wybranego szyfru i jest równa długości bloku, na którym operuje szyfr. Blok ten jest
szyfrowany za pomocą klucza. Wynik operacji jest mieszany z wiadomością za pomocą operacji
XOR, w ten sposób uzyskiwany jest fragment szyfrogramu. Uzyskany fragment szyfrogramu po
zaszyfrowaniu z użyciem tego samego klucza szyfrującego stanowi kolejny fragment strumienia
szyfrującego.Wzór dla kodowania C

i

= E(C

i−1

) ⊕ P

i

, gdzie C

0

= IV . Wzór dla dekodowania

P

i

= D(C

i−1

) ⊕ C

i

.

Implementacja
Klasa CFB dziedziczy po abstrakcyjnej klasie CipherM ode, udostępniając podstawowe metody.

2.4.6

OFB

OFB (ang. Output FeedBack) należy do rodziny trybów sprzężenia zwrotnego. W trybie OFB jeśli
nie został podany wektor inicjalizujący, wybierany jest losowy blok danych, pełniący rolę wek-
torem inicjującego. Jego długość jest zależna od wybranego szyfru i jest równa długości bloku na
którym operuje szyfr. Blok ten szyfrowany jest za pomocą klucza. Uzyskany ciąg danych stanowi
początek strumienia szyfrującego dla funkcji XOR. Tekst jawny którego zaszyfrowanie dostarczy
kolejny fragment strumienia szyfrującego. Wzór dla kodowania C

i

= P

i

⊕ O

i

. gdzie O

i

= E(O

i−1

)

i O

0

= IV . Wzór dla dekodowania P

i

= C

i

⊕ O

i

.

Implementacja
Klasa OFB dziedziczy po abstrakcyjnej klasie CipherM ode, udostępniając podstawowe metody.

2.4.7

CTR

W trybie licznikowym CTR (z ang. Counter) wybierana jest jawna funkcja, która na podstawie
pozycji bloku danych względem początku strumienia generuje ciąg danych o długości równej
długości bloku szyfru blokowego; wymagane jest by funkcja ta zwracała wartości pseudolosowe.
Wartość funkcji przekształcana jest za pomocą szyfru blokowego. Wynik operacji jest składany z
wiadomością za pomocą operacji XOR. W ten sposób uzyskiwany jest fragment szyfrogramu. Jest
to popularny tryb pracy szyfrów blokowych. CTR należy do rodziny trybów sprzężenia zwrotnego.

23

background image

W przeciwieństwie jednak do CFB i OFB pozwala odszyfrować lub zmodyfikować dowolny frag-
ment danych, bez konieczności odszyfrowywania wszystkich bloków poprzedzających.

Implementacja
Klasa CTR dziedziczy po abstrakcyjnej klasie CipherM ode, udostępniając podstawowe metody.

3

Algorytmy Kryptografii Asymetrycznej

Koncepcje kryptografii asymetrycznej (z kluczem publicznym) zaproponowali Whitfield Diffie i
Martin Hellman [1] oraz – niezależnie – Ralph Merkle [4]. Tym wkładem w dziedzinę kryptografii
była myśl, że klucze mogłyby występować parami – klucz szyfrujący i klucz deszyfrujący – i że
byłoby niemożliwe uzyskanie jednego z tych kluczy (zwykle klucza deszyfrującego) na podstawie
znajomości drugiego (zwykle klucza szyfrującego) [49].

Pierwszy uogólniony algorytm z kluczem publicznym opracowali Ralph Merkle i Martin Hell-

man [4, 5]. Ich algorytm opierał swoje bezpieczeństwo na problemie plecakowym, który jest prob-
lemem NP-zupełnym. Niestety algorytm Merkle-Hellman’a został spektakularnie złamany przy
użyciu 8-bitowy komputera domowego Aplle II [13] przez Shamir i Zippel [23, 11]. Także wszys-
tkie późniejsze algorytmy asymetryczne oparte na problemie plecakowym prędzej czy później były
łamane [49].

Od koncepcji kryptografii asymetrycznej i propozycji pierwszego algorytmu z kluczem pub-

licznym zaproponowano wiele innych algorytmów asymetrycznych bazujących na różnych zagad-
nieniach.

Algorytmy asymetryczne wykorzystuje się nie tylko do szyfrowania, czy też dystrybucji kluczy,

ale także do podpisów cyfrowych. Wszystkie aktualnie używane algorytmy asymetryczne są znacznie
bardziej powolne od algorytmów symetrycznych. Dlatego w praktyce korzysta się z hybrydowych
systemów kryptograficznych, gdzie wykorzystuje się algorytm symetryczny z losowym kluczem
sesyjnym do szyfrowania wiadomości i algorytmu z kluczem publicznym do zaszyfrowania klucza
sesyjnego.

3.1

Implementacja

—— Trwają Testy ——

3.1.1

Przykład użycia

—— Trwają Testy ——

3.2

RSA

Wkrótce po algorytmie plecakowym Markley’a w 1979 roku pojawił się pierwszy godny uwagi
algorytm z kluczem publicznym, nadający się zarówno do szyfrowania, jak i do podpisów cyfrowych
– RSA [8, 6], nazwany od nazwisk trzech odkrywców: Rivest, Shamir i Adelman.

Algorytm RSA

Klucz publiczny

n – iloczyn dwóch liczb pierwszych p i q, gdzie p i q muszą być
utajnione. n = pq.
e – liczba względnie pierwsza z (p-1)(q-1)

Klucz prywatny

d = e

−1

(mod(p − 1)(q − 1))

Szyfrowanie

c = m

e

(mod n)

Odszyfrowanie

m = c

d

(mod n)

RSA jest uznanym standardem w większości krajów świata. ISO prawie, ale nie całkiem, ut-

worzyła z RSA standard podpisu cyfrowego. RSA jest także zalecany w standardzie bankowym

24

background image

ANSI [25].

Bezpieczeństwo
Algorytm RSA wytrzymał lata intensywnej kryptoanalizy. Algorytm RSA swoje bezpieczeństwo
zawdzięcza trudności związanej z faktoryzacją (dużych) liczb. Prawie wszyscy zakładają, że fak-
toryzacja jest trudnym problemem, ale nigdy nie było to udowodnione w jakikolwiek sposób.
Jeśli przyjmiemy, że nikt nie opracował wielomianowego algorytmu faktoryzacji, będziemy musieli
określić jak duże liczby zapewniają bezpieczeństwo. Pozwolę sobie przytoczyć słowa współautora
RSA – Rona Rivest’a, który w 1977 roku stwierdził, że faktoryzacja 125-cyfrowej liczby zajmuje 40
trylionów lat [2]. W 1994 roku dokonano faktoryzacji liczby 129-cyfrowej [28] wykorzystując czas
bezczynności zaledwie 1600 komputerów rozrzuconych gdzieś w świecie przez 8 miesięcy. Czyżby
w ciągu tych 17 lat dokonał się niewyobrażalny postęp? Nie – dlatego w przypadku podobnych
problemów niemądre jest czynienie jakichkolwiek przewidywań. Szacuje się, że rządy państw mogą
dysponować mocą obliczeniową rzędu 10

9

mips-lat. Można przyjąć założenie, że moc obliczeniowa

będzie wzrastać 10-krotnie, co każde 5 lat. Należy pamiętać, że moc obliczeniowa niezbędna do
faktoryzacji 1024 bitowej liczby wynosi zaledwie 3 ∗ 10

7

a 2056 bitowej 4 ∗ 10

14

. Liczba cyfr n musi

być bardzo duża. Obecnie uznaje się, że n musi być co najmniej 4096 bitową liczbą do zastosowań
kryptografii tajnej na okres kilkunastu lat [49].

Należy także mieć świadomość, że wbrew dość rozpowszechnionemu przekonaniu wcale nie

mamy pewności, czy faktoryzacja jest problemem NP-zupełnym. W 1994 roku Peter Shore [29] za-
projektował kwantowy algorytm faktoryzacji o złożoności O(n

2

). Shor wykorzystał pewne matem-

atyczne własności liczb pierwszych i złożonych, które wyjątkowo dobrze nadawały się do tego by
uzyskać odpowiednią destruktywną i konstruktywną interferencje, kluczową dla działania komput-
era kwantowego. Wydaje się, że problemy NP-zupełne nie mają tych specjalnych własności [87].
Dlatego możemy delikatnie zakładać, że jednak istnieje klasyczny algorytm faktoryzacji liczb o
złożoności wielomianowej.

Interfejs udostępniony przez bibliotekę
Klasa RSA dziedziczy po abstrakcyjnej klasie Asymmetric, udostępniając tym samym podsta-
wowe metody.

3.3

ElGamal

W 1985 roku Taher ElGamal [9] zaproponował algorytm asymetryczny oparty o trudności związane
z obliczaniem logarytmów dyskretnych w ciele skończonym. Algorytm ElGamala może być uży-
wany zarówno do podpisów cyfrowych [18], jak i do szyfrowania.

Algorytm ElGamal

Klucz publiczny

p – liczb pierwsza (może być wspólna dla grupy użytkowników).
g – liczba losowa g < p (może być wspólna dla grupy użytkowników).
y – liczba y = g

x

, gdzie x jest liczbą losową (może być wspólna dla

grupy użytkowników mod(p)).
k – liczba wybierana losowo, względnie pierwsza z (p − 1).

Klucz prywatny

x, gdzie x < p

Szyfrowanie

a – (szyfrogram) = g

k

(mod p)

b – (szyfrogram) = y

k

M mod p), gdzie M jest wiadomością.

Odszyfrowanie

M – (tekst jawny) = b/a

x

mod p

Podpisywanie

a – (podpis) = g

k

(mod p)

b – (podpis) liczba taka, że (M = xa + kb)mod(p − 1)

Weryfikacja

Akceptacja podpisu, jeśli y

a

a

b

(mod p) = g

M

(mod p)

Istnieje wiele wariantów algorytmu, między innymi służące do uwierzytelnienia z użyciem haseł [20]
i do wymiany kluczy [16].

Bezpieczeństwo
Algorytm ElGamal jest oparty o trudności związane z obliczaniem logarytmów dyskretnych w

25

background image

ciele skończonym. Problem związany z obliczeniem logarytmu dyskretnego w ciele skończonym
jest bardzo podobny do problemu faktoryzacji i możemy założyć, że w kwestii bezpieczeństwa oba
algorytmy są podobne.

Interfejs udostępniony przez bibliotekę
Klasa ElGamal dziedziczy po abstrakcyjnej klasie Asymmetric, udostępniając tym samym pod-
stawowe metody.

3.4

ECC

Krzywe eliptyczne (ang. elliptic curve) były badane przez wiele lat i istnieje niezwykle dużo liter-
atury na ten temat. W 1985 roku Neal Koblitz [12] i V. S. Miller [10] niezależnie od siebie zapro-
ponowali wykorzystanie tych krzywych w systemach kryptograficznych z kluczem publicznym. Do
kryptografii zwykle wykorzystywane są krzywe eliptyczne nad ciałem skończonym GF (2

n

). Wiele

algorytmów z kluczem publicznym, np ElGamala [9] mogą być zaimplementowane przy użyciu
krzywych eliptycznych nad ciałami skończonymi.

Interfejs udostępniony przez bibliotekę
Klasa Elliptic dziedziczy po abstrakcyjnej klasie Asymmetric, udostępniając tym samym podsta-
wowe metody.

4

Kryptografia w przyszłości

Matematyczne fundamenty na których oparta jest kryptoanaliza szacują złożoności obliczeniowe
potrzebne do łamania poszczególnych algorytmów. Złożoność ta daje wyobrażenie jaką potężną
mocą obliczeniową należałoby dysponować aby złamać dany algorytm w satysfakcjonującym czasie.
Moc obliczeniowa wyrażona jest zwykle w czasie pracy określonego komputera w ciągu pewnego
czasu.

Istnieją jednak inne metody – nie opierające się na działaniu klasycznego komputera.

Zastosowanie tych metod może w znacznym stopniu zmienić kryptograficzne realia.

4.1

Kryptografia kwantowa

Ideę obliczeń kwantowych [22] wysunął 26 lat temu laureat Nagrody Nobla, fizyk Richard Feyn-
man [7]. Od tego czasu w badaniu hipotetycznych możliwości komputerów kwantowych dokonał
się olbrzymi postęp.

Zgodnie z obecnym stanem wiedzy urządzenia te rzeczywiście niezwykle

przyspieszyłyby rozwiązywanie niektórych problemów, na przykład takich jak łamanie szyfrów.
Istnieje jednak wiele problemów, które rozwiązywane przez komputery kwantowe byłyby niewiele
szybsze aniżeli klasycznymi metodami [87].

Podstawową cechą komputerów kwantowych, jest to, że niewielka liczba cząstek w stanie super-

pozycji może zmagazynować olbrzymią ilość informacji: za pomocą zaledwie 1000 cząstek da sie
zakodować wszystkie liczby od 1 do 2

1000

(około 10

300

). Rachunki kwantowe polegałyby na oper-

owaniu wszystkimi tymi liczbami jednocześnie – na przykład przez bombardowanie układu kwan-
towego wiązką światła z lasera. Po zakończeniu obliczeń trzeba zmierzyć stan układu. Niestety,
podczas tej operacji znikają wszystkie równoległe stany z wyjątkiem jednego wybranego losowo.
Mimo to sprytne manipulowanie cząstkami może pozwolić na szybkie rozwiązywanie pewnych prob-
lemów, na przykład takich jak rozkład dużych liczb na czynniki pierwsze.

Algorytm kwantowy generujący kolizję funkcji skrótu, czy tez łamiący algorytm symetryczny

mógłby być błyskawiczny. Jeśli zechcemy wygenerować kolizję dla 512 bitowego SHA-2 wystar-
czy skorzystać z 512 cząstkowego układu. W chwili pomiaru każda z nich może przyjąć jedną z
dwóch wartości 0 lub 1. Aby opisać stan kwantowy 512 cząstek, musimy dla każdego z możliwych
wyniku pomiaru podać pewną liczbę. Liczby te noszą nazwę amplitud i mają związek z praw-
dopodobieństwem uzyskania takiego a nie innego wyniku pomiaru stanu układu. Jednak inaczej
niż w przypadku prawdopodobieństwa amplitudy są liczbami zespolonymi. Istnieje 2

512

takich

26

background image

liczb. Używając fachowej terminologii powiemy, że układ 512 cząstek znajduje się w 2

512

super-

pozycji stanów kwantowych. Układ taki pozwala zakodować 2

512

liczb poprzez różne operacje na

należących do niego cząstkach. Jeśli po przeprowadzeniu różnych takich operacji bylibyśmy w stanie
zidentyfikować stan układu kwantowego, to sprawdzilibyśmy jednocześnie 2

512

wariantów rozwiąza-

nia. Nie jest to jednak takie proste. Zgodnie z regułami mechaniki kwantowej, kiedy dokonujemy
pomiaru stanu układu (co jest konieczne, by zidentyfikować stan końcowy), losowo ustawia się
jedna z 2

512

możliwości. Na szczęście zjawiska kwantowe umożliwiają stosowanie pewnych trików.

Amplitudy dodatnie i ujemne mogą się znosić, co w mechanice kwantowej nosi nazwę interfer-
encji destrukcyjnej. Dobry algorytm kwantowy powinien gwarantować wzajemne znoszenie się
ścieżek prowadzących do błędnych odpowiedzi. Ponadto amplitudy ścieżek prowadzących do do-
brych odpowiedzi powinny mieć te same znaki, co powoduje konstruktywną interferencję i zwiększa
prawdopodobieństwo otrzymania poprawnego wyniku końcowego.

W 1994 roku Peter Shor [29] pokazał w jaki sposób algorytm kwantowy może rozłożyć na czyn-

niki pierwsze liczbę o n cyfrach w około n

2

krokach. Taki algorytm łamie algorytmy kryptografii

asymetrycznej korzystającej z trudności faktoryzacji liczb w czasie rzeczywistym. Oznacza to,
że zabezpieczenia oparte na faktoryzacji, takie jak RSA, mogłyby być złamane w czasie rzeczy-
wistym. Shor wykorzystał pewne właściwości matematyczne liczb pierwszych i złożonych, które
wyjątkowo dobrze nadawały się do tego, by uzyskać destruktywną i konstruktywną interferencje,
kluczową dla działania komputera kwantowego. Jeśli chcielibyśmy opracować algorytm kwantowy
generujący kolizje potrzebowalibyśmy wykorzystać strukturę funkcji skrótu. Nie możemy uzyskać
wykładniczego przyspieszenia, traktując problemy jak czarne skrzynki zawierające wykładniczo
wiele rozwiązań, które trzeba sprawdzić równolegle.

Tego typu podejście umożliwia osiągnię-

cie pewnego przyspieszenia “zaledwie” rzędu

2

512

, ale nie przejścia ze złożoności wykładniczej

do wielomianowej.

Funkcje skrótu są bezpieczne do zastosowań kryptograficznych [50], nawet

dla osoby próbującej wygenerować kolizje na komputerze kwantowym o ile nie została wyko-
rzystana jakaś specyficzna struktura algorytmu funkcji skrótu, czy też algorytmu szyfrowania
symetrycznego i to w sposób wykraczający daleko poza znane dziś techniki [61]. Aby utrudnić
rozpracowanie funkcji skrótu pod kątem przydatności jej struktury do wykorzystania w algorytmie
kwantowym, należy stosować co najmniej ideę “niezależnych gałęzi” podobnie jak w stosunkowo
prostych RIPEMD160 [91] i FORK256 [76]. Podejście niezależnych gałęzi powoduje, że podczas
łamania takiej funkcji nie tylko bierze się pod uwagę złożoność czasową, ale także pamięciową,
co sprawia, że funkcje skrótu bazujące na niezależnych gałęziach są bezpieczniejsze od standard-
owych funkcji skrótu, których bezpieczeństwo opiera się wyłącznie na złożoności czasowej. O ile
oczywiście nie można, korzystając z pewnych słabości samych algorytmów funkcji skrótu, wyelim-
inować złożoności pamięciowej na rzecz zwiększenia złożoności obliczeniowej, co miało juz miejsce
w przypadku wymienionych algorytmów [80].

4.2

Kryptografia oparta na biotechnologii – obliczenia z użyciem DNA

W 1994 roku Leonard Adleman [26] zademonstrował metodę rozwiązywania problemu NP-zupełnego
w laboratorium biochemicznym, wykorzystując cząstki DNA do odgadywania rozwiązań prob-
lemu [49]. Problem który Adleman rozwiązał był przykładem skierowanej trasy Hamiltona: mając
dane położenie miast połączonych drogami jednokierunkowymi, należy znaleźć taką trasę z mi-
asta
A do miasta Z, która przechodzi dokładnie jednokrotnie przez wszystkie pozostałe miasta na
mapie.
Każde miasto było reprezentowane przez różny losowy łańcuch 20-węzłowy DNA. Adleman
dokonał syntezy 50 pikomoli łańcucha DNA reprezentującego każde miasto. Każda droga także
została przedstawiona za pomocą 20-węzłowego łańcucha DNA, ale te łańcuchy nie były dobrane
losowo: celowe były wybrane w taki sposób, że “wejściowy” koniec łańcucha DNA reprezentu-
jącego drogę z miasta P do miasta K dążył do zlepiania się z łańcuchem DNA reprezentującym
miasto P , a koniec drogi P K dążył do zlepiania się z łańcuchem DNA reprezentującym miasto
K. Adleman zsyntetyzował 50 pikomoli DNA reprezentującego każdą drogę, wymieszał je razem
z DNA reprezentującym wszystkie miasta i dodał enzymu ligazy, aby połączyć łańcuchy DNA
dróg w poprawnym stylu. Oznacza to, że “wyjściowy” koniec drogi od P do K będzie zawsze
dołączony do “wejściowego” końca drogi, która rozpoczyna się w pewnym innym mieście niż K.
Ligaza zbudowała dużą liczbę łańcuchów DNA reprezentujących poprawne, a z drugiej strony

27

background image

losowe, wielodrożne trasy w obrębie mapy. Z tej mieszaniny tras można odnaleźć nawet poje-
dynczą molekułę – DNA, która reprezentuje rozwiązanie problemu. Adleman stosując powszechnie
znane techniki biologii molekularnej, odrzucił wszystkie łańcuchy DNA reprezentujące trasy, które
były zbyt długie lub zbyt krótkie. Następnie odrzucił on te które pomijały miasta, które powinny
znaleźć się na trasie Hamiltona. Jeśli po tej weryfikacji pozostanie jakiś DNA, jest on przeglądany,
aby ustalić przedstawioną przez niego sekwencję dróg: jest to rozwiązanie problem skierowanej
trasy Hamiltona. Chociaż Adleman przeprowadził swoje doświadczenie na mapie składającej się z
zaledwie 7 miast, to ta technika była w początkowym stadium rozwoju i nie ma absolutnie żadnych
przeszkód, które uniemożliwiałyby jej stosowanie do problemów o znanie większych rozmiarach.

5

TODO

W następnej wersji biblioteki zostaną zaimplementowane dwa standardy: DSA – zaproponowany
przez NIST i NSA, oraz Rosyjski GOST 34.10. Biblioteka zostanie uzupełniona o mechanizm
wprowadzania hasła, przez nakreślanie symboli zarówno przez kursor myszki na ekranie jak i za
pomocą dłoni przed kamerą. Zostanie wprowadzony mechanizm bezpiecznego usuwania danych.
Kolejna wersja biblioteki dzięki algorytmom skanowania twarzy wraz z bezpiecznym przesyłaniem
danych z pewnością umożliwi stosunkowo bezproblemowy dostęp do niejawnych i często eksploa-
towanych danych, bez wprowadzania haseł.

Zostanie także dodany bardzo przyjazny i prosty

interfejs umożliwiający szyfrowanie techniką zwaną “szyfrowaniem przypadkowym”.

28

background image

Literatura

[1] Whitfield Diffie, Martin E. Hellman. New Directions in Cryptography, IEEE Transactions on

Information Theory, vol. IT-22 6, 644–654, 1976.

[2] Martin Gardner. A New Kind of Cipher That Would Take Millions of Years to Break, Scientic

American, August 1977, 1977.

[3] NIST. DATA ENCRYPTION STANDARD (DES), FIPS PUB 46-3, 1977.

http://csrc.nist.

gov/publications/fips/fips46-3/fips46-3.pdf

[4] Ralph Merkle. Secure Communication Over Insecure Channels. Communications of ACM, vol.

21, 4, 294-299, 1978.

[5] Ralph Merkle, Martin Hellman. Hiding Information and Signatures in Trapdoor Knapsacks,

IEEE Trans. Information Theory, 24(5), pp525–530, 1978.

[6] R. L. Rivest, A. Shamir, L. M. Adelman. A method for obtaining digital signatures and public-

key cryptosystems, MIT/LCS/TM-82, 1979.

[7] Richard Feynman. Simulating physics with computers, IJTP 21, 1982.

[8] R. L. Rivest, A. Shamir, L. M. Adelman. A method for obtaining digital signatures and public-

key cryptosystems, Communications of the ACM, vol. 26, 96-99, 1983. Available:

http://

people.csail.mit.edu/rivest/Rsapaper.pdf

[9] Taher ElGamal A public key cryptosystcm and a signature scheme based on discretc logarithms,

EEE Transactions on Information Theory, Vol. IT-30, n. 4, pp. 469-472, 1985.

[10] V. S. Miller, Use of Elliptic Curves in Cryptography, Proceedings of the International Cryp-

tology Conference, pp. 417-426, 1986.

[11] Wayne Patterson. Mathematical Cryptology for Computer Scientists and Mathematicians,

Rowman & Littlefield, Totowa, 1987.

[12] N. Koblitz, Elliptic curve cryptosystems”, Mathematics of Computation, vol 48, 203-209, 1987.

[13] Whitfield Diffie. The first ten years of public-key cryptography, Proceedings of the IEEE, vol.

76, n. 5, 560-577, 1988.

[14] GOST 28147-89. Cryptographic Protection for Data Processing Systems, Cryptographic

Transformation Algorithm, Government Standard of the U.S.S.R., Inv. No. 3583, UDC
681.325.6:006.354, 1990. Available:

http://www.jetico.com/gost.zip

[15] W.J. Jaburek. A Generalization of ElGamal’s Public Key Cryptosystem, Advances in. Cryp-

tology EUROCRYPT ’89 Proceedings, Springer-Verlag, pp. 23-28, 1990.

[16] W.J. Jaburek. A Generalization of ElGamal’s Public Key Cryptosystem, Advances in. Cryp-

tology EUROCRYPT ’89 Proceedings, Springer-Verlag, pp. 23-28, 1990.

[17] S. Saryazdi. An extension to ElGamal public-key cryptosystem with a new signature, Proceed-

ings of the 1990 Bilkent International Conference on New Trends in Communication, Control,
and Signal Processing, 1990.

[18] S. Saryazdi. An extension to ElGamal public-key cryptosystem with a new signature, Proceed-

ings of the 1990 Bilkent International Conference on New Trends in Communication, Control,
and Signal Processing, 1990.

[19] C. C. Chang, S. J. Hwang. Cryptographic Authentication of Passwords, Proceedings 25th

Annual 1991 IEEE International Carnahan Conference on Security Technology, pp. 126–130,
1991.

29

background image

[20] C. C. Chang, S. J. Hwang. Cryptographic Authentication of Passwords, Proceedings 25th

Annual 1991 IEEE International Carnahan Conference on Security Technology, pp. 126–130,
1991.

[21] Research and Development in Advanced Communications Technologies in Europe, RIPE In-

tegrity Primitives: Final Report of RACE Integrity Primitives Evaluation (R1040), RACE,
1992.

[22] David Deutsch. A comprehensive and inspiring guide to quantum computing, Quantum com-

putation, Physics World, 1/6/92, 1992.

[23] Adi Shamir. A Polynomial Time Algorithm for Breaking the Basic Merkle-Hellman Cryptosys-

tem, CRYPTO, pp279–288, 1992.

[24] Yuliang Zheng, Josef Pieprzyk, Jennifer Seberry. HAVAL — a one-way hashing algorithm with

variable length of output, Advances in Cryptology – AUSCRYPT’92, Lecture Notes in Com-
puter Science, Vol.718, pp.83-104, Springer-Verlag, 1993. Available:

http://labs.calyptix.

com/files/haval-paper.pdf

[25] ANSI X9.31. Working draft: Public key Cryptography Using Irreversible Algorithms for the

Financial Services Industry, American Bankers Association, 1993.

[26] Leonard M. Adleman. Molecular Computation of Solutions to Combinatorial Problems, Sci-

ence, New Series, vol. 266, n. 5187, pp. 1021-1024, 1994.

[27] Josef Pieprzyk and Leonid Tombak. Original GOST Specs translated in English, GOST 28147-

89, 1994. Available:

http://vipul.net/gost/papers/gost-spec.ps.gz

[28] D. Atkins, M. Graff, A. Lenstra, P. Leyland. The Magic Words are Squeamish Ossifrage

(extended abstract), Asiacrypt, 1994. Available:

http://www.mit.edu:8001/people/warlord/rsa129.ps

[29] Peter W. Shor. Algorithms for Quantum Computation: Discrete Logarithms and Factoring,

Proc. 35nd Annual Symposium on Foundations of Computer Science (Shafi Goldwasser, ed.),
IEEE Computer Society Press (1994), 124-134, 1994.

[30] Paul C. van Oorschot, Michael J. Wiener. Parallel collision search with applications to hash

functions and discrete logarithms, 2nd ACM Conference on Computer and Communications
Security, ACM Press, pp. 210-218, 1994.

[31] Information technology. Cryptographic Data Security. Produce and check procedures of Elec-

tronic Digital Signatures based on Asymmetric Cryptographic Algorithm, GOST R 34.10-94,
Gosudarstvennyi Standard of Russian Federation, Government Committee of the Russia for
Standards, 1994.

[32] Lars R. Knudsen. Truncated and Higher Order Differentials, Fast Software Encryption, 196-

211, 1994.

[33] S.B. Xu, D.K. He, X.M. Wang. An Implementation of the GSM General Data Encryption

Algorithm A5, CHINACRYPT’94, Xidian, China, 11-15, pp. 287-291, 1994.

[34] National Institute of Standards and Technology, NIST FIPS PUB 186. DIGITAL SIGNA-

TURE STANDARD (DSS), 1994.

[35] N. Rogier, Pascal Chauvaud. The compression function of MD2 is not collision free, Selected

Areas in Cryptography - SAC’95 Ottawa, Canada, May 18-19, 1995.

[36] RSA Laboratories Security Bulletin #4, 1996. Available:

ftp://ftp.rsasecurity.com/pub/

pdfs/bulletn4.pdf

[37] Hans Dobbertin, Antoon Bosselaers, Bart Preneel. RIPEMD-160: A Strengthened Version of

RIPEMD, 1996. Available:

http://homes.esat.kuleuven.be/~cosicart/pdf/AB-9601/AB-9601.pdf

30

background image

[38] John Kelsey, Bruce Schneier, David Wagner. Key-schedule cryptanalysis of IDEA, G-

DES, GOST, SAFER, and triple-DES, Advances in Cryptology - CRYPTO ’96 Proceed-
ings. Springer-Verlag, August 1996, Available:

http://www.cs.berkeley.edu/~daw/papers/

keysched-crypto96.ps

[39] Markku-Juhani Saarinen. A chosen key attack against the secret S-boxes of GOST, 1998.

[40] Ross Anderson, Eli Biham, Lars Knudsen. Serpent: A Flexible Block Cipher With Maximum

Assurance, 1998. Available:

http://www.cl.cam.ac.uk/~rja14/Papers/ventura.pdf

[41] J. Daemen, V. Rijmen. The block cipher Rijndael, Smart Card research and Applications,

LNCS 1820, Springer-Verlag, pp. 288-296, 1998.

[42] Hans Dobbertin. Cryptanalysis of MD4. J. Cryptology 11(4): 253-271, 1998.

[43] J. Daemen, V. Rijmen. AES Proposal: Rijndael, AES Algorithm Submission, September 3,

1999.

[44] NIST, Secure Hashing, 2000. Available:

http://csrc.nist.gov/groups/ST/toolkit/secure_hashing.html

[45] Scott R. Fluhrer, David A. McGrew. Statistical Analysis of the Alleged RC4 Keystream Gen-

erator,Proceedings, Fast Software Encryption 2000, 2000.

[46] Scott Fluhrer and Itsik Mantin and Adi Shamir. Weaknesses in the Key Scheduling Algorithm

of RC4, Lecture Notes in Computer Science, Vol. 2259, 1-24, Revised Papers from the 8th
Annual International Workshop on Selected Areas in Cryptography, 2001.

[47] NIST. Announcing the ADVANCED ENCRYPTION STANDARD (AES), Federal Infor-

mation Processing Standards Publication 197, 2001. Available:

http://csrc.nist.gov/

publications/fips/fips197/fips-197.pdf

[48] Nicolas Courtois, Josef Pieprzyk. Cryptanalysis of Block Ciphers with Overdefined Systems of

Equations, Cryptology ePrint Archive: Report 2002/044. 2002.

[49] Bruce Schneier. Kryptografia dla praktyków, Wydawnictwo Naukowo-Techniczne, ISBN 83-

204-2678-2, 2002.

[50] Scott Aaronson. Quantum Lower Bound for the Collision Problem, in Proc. ACM TOC’2002,

2002.

[51] Bart Van Rompay, Alex Biryukov, Bart Preneel, Joos Vandewalle. Cryptanalysis of 3-pass

HAVAL, Advances in Cryptology – ASIACRYPT 2003, 9th International Conference on the
Theory and Application of Cryptology and Information Security. Available:

http://www.iacr.

org/archive/asiacrypt2003/05_Session05/14_134/28940215.pdf

[52] Elad Barkan, Eli Biham, Nathan Keller. Instant Ciphertext-Only Cryptanalysis of GSM

Encrypted Communication, CRYPTO 2003, pp600-616, 2003. Available:

http://www.cs.

technion.ac.il/users/wwwb/cgi-bin/tr-get.cgi/2006/CS/CS-2006-07.pdf

[53] Ondrej Mikle. Practical Attacks on Digital Signatures Using MD5 Message Digest, Cryptology

ePrint Archive, Report 2004/356, 2004. Available:

http://eprint.iacr.org/2004/356

[54] H. Gilbert, H. Handschuh. Security Analysis of SHA-256 and sisters, Selected Areas in Cryp-

tography, SAC 2003, Ottawa, Canada, Lecture Notes in Computer Science, vol. 3006, M. Matsui
and R. Zuccheratopp (Eds), pp. 175-193, 2004.

[55] Philip Hawkes, Michael Paddon, Gregory G. Rose. Musings on the Wang et al. MD5 Col-

lision, Cryptology ePrint Archive, Report 2004/264, 2004. Available:

http://eprint.iacr.

org/2004/264.pdf

31

background image

[56] Xiaoyun Wang, Dengguo Feng, Xuejia Lai, Hongbo Yu. Collisions for Hash Functions MD4,

MD5, HAVAL-128 and RIPEMD, Cryptology ePrint Archive: Report 2004-199, 2004. Avail-
able:

http://eprint.iacr.org/2004/199.pdf

[57] Fr´

ed´

eric Muller. The MD2 Hash Function is Not One-Way, ASIACRYPT 2004, pp214–229.

[58] Hongjun Wu. The Misuse of RC4 in Microsoft Word and Excel, Cryptology ePrint Archive:

Report 2005/007, 2005. Available:

http://eprint.iacr.org/2005/007

[59] Eli Biham, Louis Granboulan, Phong Q. Nguyen. Impossible Fault Analysis of RC4 and Dif-

ferential Fault Analysis of RC4, FSE 2005: 359-367, 2005.

[60] Daniel J. Bernstein. Salsa20 design, specification, security and speed, 2005. Available:

http:

//www.ecrypt.eu.org/stream/p3ciphers/salsa20/salsa20_p3.zip

[61] Scott Aaronson. Limitations of Quantum Advice and One-Way Communication, Theory of

Computing 1:1-28, 2005.

[62] Christophe De Canniere, Bart Preneel. Trivium Specifications, eSTREAM submitted papers,

2005. Available:

http://www.ecrypt.eu.org/stream/ciphers/trivium/trivium.pdf

[63] Xiaoyun Wang, Yiqun Lisa Yin, Hongbo Yu. Finding Collisions in the Full SHA-1, CRYPTO

2005, 17-36, 2005.

[64] Eli Biham, Rafi Chen, Antoine Joux, Patrick Carribault, Christophe Lemuet, William Jalby.

Collisions of SHA-0 and Reduced SHA-1, Advances in Cryptology – EUROCRYPT 2005, vol-
ume 3494 of Lecture Notes in Computer Science, 36–57, 2005.

[65] Yusuke Naito, Yu Sasaki, Noboru Kunihiro, Kazuo Ohta. Improved Collision Attack on MD4,

2005. Available:

http://eprint.iacr.org/2005/151.pdf

[66] Arjen Lenstra, Xiaoyun Wang, Benne de Weger. Colliding X.509 Certificates, Cryptology

ePrint Archive: Report 2005-067, 2005. Available:

http://eprint.iacr.org/2005/067.pdf

[67] Vlastimil Klima. Finding MD5 Collisions – a Toy For a Notebook, Cryptology ePrint Archive:

Report 2005/075. Available:

http://eprint.iacr.org/2005/075.pdf

[68] Jean-S´

ebastien Coron, Yevgeniy Dodis, C´

ecile Malinaud, Prashant Puniya. Merkle-Damg˚

ard

Revisited : how to Construct a Hash Function, CRYPTO 2005. Available:

http://www.

jscoron.fr/publications/merkle.pdf

[69] J. Black, M. Cochran, T. Highland. A Study of the MD5 Attacks: Insights and Improvements.

2006. Available:

http://www.cs.colorado.edu/~jrblack/papers/md5e-full.pdf

[70] Marc Stevens. Fast Collision Attack on MD5, Cryptology ePrint Archive: Report 2006/104,

2006. Available:

http://eprint.iacr.org/2006/104.pdf

[71] Vlastimil Klima. Tunnels in Hash Functions: MD5 Collisions Within a Minute, Cryptology

ePrint Archive: Report 2006/105. Available:

http://eprint.iacr.org/2006/105.pdf

[72] Paul Crowley. Truncated differential cryptanalysis of five rounds of Salsa20,

SASC

2006

workshop,

2006.

Available:

http://www.ciphergoth.org/crypto/salsa20/

salsa20-cryptanalysis.pdf

[73] Christian Rechberger, Christophe De Canni´

ere. Finding SHA-1 Characteristics: General Re-

sults and Applications, ASIACRYPT 2006: 1-20, 2006.

[74] Hongbo Yu, Xiaoyun Wang, Aaram Yun, Sangwoo Park. Cryptanalysis of the Full HAVAL

with 4 and 5 Passes, Lecture Notes in Computer Science, Volume 4047/2006.

[75] Zhangyi Wang, Huanguo Zhang, Zhongping Qin, Qingshu Meng. Cryptanalysis of 4-Pass

HAVAL, Cryptology ePrint Archive: Report 2006/161, 2006. Available:

http://eprint.iacr.

org/2006/161

32

background image

[76] D. HONG, D. CHANG, J. SUNG, S. LEE, S. HONG, J. LEE, D. MOON, S. CHEE. A New

Dedicated 256-Bit Hash Function: FORK-256, FSE 2006, LNCS 4047, Springer-Verlag, pp. 195
– 209, 2006.

[77] Przemysław Rodwald. Cryptoanalysis of Petra’s Family Hash Functions, MCC 2006: 1th

Military Command Information System Conference, 2006.

[78] Marc Stevens. On Collisions for MD5, MASTER’S THESIS, 2007. Available:

http://www.win.tue.nl/hashclash/On%20Collisions%20for%20MD5%20-%20M.M.J.
%20Stevens.pdf

[79] Deukjo Hong, Jaechul Sung, Seokhie Hong, Sangjin Lee, Dukjae Moon. A New Dedicated 256-

bit Hash Function : FORK-256, NIST, Computer Seciurity Division, 2007. Available:

http:

//csrc.nist.gov/groups/ST/hash/documents/Sung_FORK-256.pdf

[80] Krystian Matusiewicz, Thomas Peyrin, Olivier Billet, Scott Contini, Josef Pieprzyk. Crypt-

analysis of FORK-256, Lecture Notes in Computer Science, Volume 4593/2007, 2007.

[81] D. Hong, D. Chang, J. Sung, S. Lee, S. Hong, J. Lee, D. Moon, S. Chee. New FORK-256,

Cryptology ePrint Archive 2007/185, 2007. Available:

http://eprint.iacr.org/2007/185

,

http://csrc.nist.gov/groups/ST/hash/documents/Sung_FORK-256.pdf

[82] Philip Hawkes, Michael Paddon, Gregory G. Rose. On Corrective Patterns for the SHA-2

Family, Cryptology ePrint Archive: Report 2004/207, 2007. Available:

http://eprint.iacr.

org/2004/207

[83] Shiho Moriai, Yiqun Lisa Yin. Cryptanalysis of Twofish (II), Technical Report of IEICE, 2007.

Available:

http://www.schneier.com/twofish-analysis-shiho.pdf

[84] Eli Biham, Orr Dunkelman, Nathan Keller. Improved Slide Attacks, Fast Software Encryption,

Volume 4593/2007, 2007. Available:

http://www.ma.huji.ac.il/~nkeller/article-921.ps

[85] Cameron McDonald, Chris Charnes, Josef Pieprzyk. Attacking Bivium with MiniSat, 2007.

Available:

http://www.ecrypt.eu.org/stream/papersdir/2007/040.pdf

[86] Martin Cochran. Notes on the Wang et al. 2

63

SHA-1 Differential Path, Cryptology ePrint

Archive, Report 2007/474, 2007.

[87] Scott Aaronson. Granice kwantowej informatyki, Świat Nauki, 5(201), 2008.

[88] Steve Babbage, Christophe De Canniere, Anne Canteaut, Carlos Cid, Henri Gilbert,

Thomas Johansson, Matthew Parker, Bart Preneel, Vincent Rijmen, and Matthew Robshaw.
The eSTREAM Portfolio, April 15, 2008. Available:

http://www.ecrypt.eu.org/stream/

portfolio.pdf

[89] Thomas Peyrin, Olivier Billet. Cryptanalysis of FORK-256, SAPHIR project, 2008. Available:

http://bo.blackowl.org/papers/fork.pdf

[90] Jean-Philippe Aumasson, Simon Fischer, Shahram Khazaei, Willi Meier, Christian Rech-

berger. New Features of Latin Dances: Analysis of Salsa, ChaCha, and Rumba, Cryptology
ePrint Archive: Report 2007/472, 2007. Available:

http://eprint.iacr.org/2007/472

[91] RIPEMD-160, The hash function RIPEMD-160, Available:

http://homes.esat.kuleuven.

be/~bosselae/ripemd160.html

[92] Wikipedia. Block cipher modes of operation,

http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation

[93] Serpent homepage.

http://www.cl.cam.ac.uk/~rja14/serpent.html

[94] Wikipedia. Truncated differential cryptanalysis,

http://en.wikipedia.org/wiki/Truncated_differential_cryptanalysis

33

background image

[95] Wikipedia. Pseudo-Hadamard transform,

http://en.wikipedia.org/wiki/Pseudo-Hadamard_transform

[96] Wikipedia. Feistel cipher,

http://en.wikipedia.org/wiki/Feistel_cipher

[97] Wikipedia. Weak key,

http://en.wikipedia.org/wiki/Weak_key

[98] Blowfish homepage.

http://www.schneier.com/paper-blowfish-fse.html

[99] Products that Use Twofish.

http://www.schneier.com/twofish-products.html

[100] Twofish homepage.

http://www.schneier.com/twofish.html

[101] Electronic Frontier Foundation.

http://www.eff.org/

[102] Wikipedia. Advanced Encryption Standard process,

http://en.wikipedia.org/wiki/Advanced_Encryption_Standard_process

[103] Wikipedia. Truncated differential cryptanalysis,

http://en.wikipedia.org/wiki/Truncated_differential_cryptanalysis

[104] Salsa20 homepage.

http://cr.yp.to/snuffle.html

[105] eSTREAM Project.

http://www.ecrypt.eu.org/stream/

[106] European Network of Excellence for Cryptology.

http://www.ecrypt.eu.org/

[107] THC. Cracking A5, Available:

http://wiki.thc.org/cracking_a5

[108] Wikipedia. RC4, Available:

http://en.wikipedia.org/wiki/RC4

[109] Vincent Rijmen, Paulo S. L. M. Barreto. WHIRLPOOL homepage, Available:

http:

//paginas.terra.com.br/informatica/paulobarreto/WhirlpoolPage.html

[110] RFC 3174, Secure Hash Algorithm 1 Available:

http://tools.ietf.org/html/rfc3174

[111] Wikipedia, Hash function. Available:

http://en.wikipedia.org/wiki/Hash_function

[112] Wikipedia. Cryptographic hash function.

Available:

http://en.wikipedia.org/wiki/Cryptographic_hash_function

[113] RFC 1319. Available:

http://tools.ietf.org/html/rfc1319

[114] RFC 1321. Available:

http://tools.ietf.org/html/rfc1321

[115] Klima Vlastimil. Homepage of the project MD5 collisions. Available:

http://cryptography.

hyperlink.cz/MD5_collisions.html

34


Document Outline


Wyszukiwarka

Podobne podstrony:
The Simple Telephone
Simple Present, the Present Continuous, the Simple Past, the Past Continuous or the Present Perfect
The Sims Building Theme 6 The Simple Life
The Simple Secrets To Regaining The Sexual Stamina You Had As A Teenager
THE SIMPLE PAST TENSE
THE SIMPLE PRESENT TENSE 2
The Apocryphon of John The Nag Hammadi Library
questions in the simple past
Play the simple melody Berlin
The simple joy of living
Internet Marketing The simple way
The Simple Present Tense
islcollective worksheets elementary a1 preintermediate a2 high school spelling past the simple past
THE SIMPLE PAST TENSE POSITIVE AND NEGATIVE
Babauta Leo The Simple Guide to a Minimalist Life
The Standard Template Library (STL) Tutorial
Parametric Analysis of the Simplest Model of the Theory of Thermal Explosion the Zel dovich Semenov
10 The simple sentence
Charles the Simple, Robert of Neustria,

więcej podobnych podstron