8 Funkcje skrotu

background image

2014-04-15

1

Bezpieczeństwo

i ochrona danych


Jednokierunkowe funkcje

skrótu i ich zastosowania

Agenda

• Funkcje jednokierunkowe
• Podpis elektroniczny
• Wybrane algorytmy skrótu

– MD5, SHA

• Ataki na funkcje skrótu i podpisy

elektroniczne

• Algorytmy wymiany klucza

Funkcja jednokierunkowa

• Stworzenie praktycznego systemu szyfrowania asymetrycznego z

kluczem jawnym wymaga zastosowania funkcji jednokierunkowej
z bocznym wejściem
(ang. trapdoor one-way function)

Funkcja jednokierunkowa to taka, która przekształca swoją

dziedzinę na przedział w taki sposób, że każda wartość funkcji ma
tylko jedną odwrotność, z tym że obliczenie funkcji jest łatwe
(czas wielomianowy), a obliczenie odwrotności niewykonalne
(wysiłek obliczeniowy rośnie szybciej niż wielomianowo):

– Y=f(X) - łatwe
– X=f

-1

(Y) - niewykonalne

Funkcja jednokierunkowa z
bocznym wejściem

• Obliczenie funkcji jednokierunkowej z bocznym

wejściem jest łatwe w jednym kierunku, a niewykonalne
w drugim, chyba że są znane pewne dodatkowe
informacje, które umożliwiają obliczenie odwrotności w
czasie wielomianowym

• Y=f

k

(X) - łatwe przy znajomości k i X

• X=f

k

-1

(Y) - łatwe przy znajomości k i Y

• X=f

k

-1

(Y) - niewykonalne, gdy znamy Y, a nie znamy k

Algorytmy skrótu

• Funkcja skrótu z danych o zmiennym rozmiarze wylicza

pewien wynik H(M) o stałym rozmiarze, zwany też
wyciągiem lub skrótem komunikatu

• Wynik skrótu jest funkcją wszystkich bitów komunikatu i

zapewnia:

– wykrywanie błędów,
– uwierzytelnianie (w pewnych warunkach)

Wymagania dla kryptograficznej
funkcji skrótu

• H(x) można zastosować do dowolnej wielkości

bloku danych

• H(x) tworzy dane wyjściowe o ustalonej

długości

• H(x) jest łatwo obliczyć dla każdego x, co

ułatwia implementację sprzętową i
programową

background image

2014-04-15

2

Wymagania dla kryptograficznej
funkcji skrótu

• Dla każdego kodu m znalezienie takiego x, że H(x)=m

nie jest wykonywalne na drodze obliczeń –
jednokierunkowość

• Dla każdego danego bloku x, znalezienie takiego y

różnego od x, dla którego H(y)=H(x) nie jest
wykonywalne na drodze obliczeń – słaba odporność na
kolizje

• Znalezienie pary (x,y), że H(y)=H(x) nie jest

wykonywalne na drodze obliczeń – (silna) odporność na
kolizje

Skrót niekryptograficzny (1)

• Dane: X = (X

0

,X

1

,X

2

,…,X

n-1

), X

i

są bajtami

• Niech hash(X) = X

0

+X

1

+X

2

+…+X

n-1

• Czy jest to bezpieczne?
• Przykład: X = (10101010,00001111)
• Skrót:10111001
• Ale również jest to skrót

Y = (00001111,10101010)

• Łatwo znaleźć kolizję, więc nie jest

bezpieczne…

Skrót niekryptograficzny(2)

• Dane: X = (X

0

,X

1

,X

2

,…,X

n-1

)

• Niech skrót będzie następujący:

h(X) = nX

0

+(n-1)X

1

+(n-2)X

2

+…+1

X

n-1

• Czy jest bezpieczny?

h(10101010,00001111)

h(00001111,10101010)

• Lecz skrót (00000001,00001111) jest taki sam

jak skrót (00000000,00010001)

• Nie jest bezpieczny, lecz wykorzystywany w

niekrytycznych aplikacjach np

.

rsync

Skrót niekryptograficzny (3)

• Cyclic Redundancy Check (CRC)
• CRC jest resztą z dzielenia
• Dobre dla wykrywania błędów
• Łatwe znalezienie kolizji
• CRC czasami, przypadkowo pojawia się w

kontekście bezpieczeństwa (WEP)

Popularne funkcje

MD5

opracowane przez Rivest’a

– 128 bit wyjście
– MD5 – wykryto kolizje

SHA-1

standard rządu US (podobne do

MD5)

– 160 bit wyjście
– również uważana za mało bezpieczne rozwiązanie

• Wiele innych, lecz MD5 oraz SHA-1 są

najpopularniejsze

Notacja klucza publicznego

Podpis

Alicji dla wiadomości M

prywatnym kluczem:

[M]

Alicja

Szyfrowanie

wiadomości M

kluczem publicznym:

{M}

Alicja

• Wtedy:

{[M]

Alicja

}

Alicja

= M

[{M}

Alicja

]

Alicja

= M

background image

2014-04-15

3

Zastosowania funkcji skrótu:
Podpis elektroniczny

• Przypuśćmy, że Alicja podpisała M

– Alicja wysyła M oraz S = [M]

Alicja

do Boba

– Bob weryfikuje, że M = {S}

Alicja

• Jeżeli M jest duże, [M]

Alicja

jest kosztowne

obliczeniowo

• Przypuśćmy natomiast, że Alicja podpisuje

h(M), gdzie h(M) jest mniejsze niż M

– Alicja wysyła M oraz S = [h(M)]

Alicja

do Boba

– Bob sprawdza czy h(M) = {S}

Alicja

Podpisy elektroniczne

• MAC

- Message Authentication Code,

także MIC - Message Integrity Code

– to w kryptografii kod służący uwierzytelnieniu

danych.

– argumentami funkcji uwierzytelniającej są tajny

klucz oraz wiadomość.

– wartością wyjściową funkcji jest kod MAC.

Podpisy elektroniczne

• HMAC

keyed-Hash Message Authentication Code

– MAC z kluczem tajnym zapewniający zarówno

ochronę integralności jak i autentyczności
danych.

– Standardowy kod MAC zapewnia ochronę

integralności ale może podlegać sfałszowaniu jeśli
nie jest zabezpieczony dodatkowym
mechanizmem chroniącym jego autentyczność
(np. podpisem cyfrowym).

Podpisy elektroniczne

• Podpis elektroniczny zapewnia ochronę

integralności

– Podobnie jak MAC oraz HMAC

• Dlaczego?
• Alicja wysyła M oraz S = [h(M)]

Alicja

do Boba

• Jeżeli M będzie zmienione an M

lub S

zmienione na S

(przypadkowo lub celowo)

Bob wykryje to :

h(M

)

{S}

Alicja

, h(M)

{S

}

Alicja

, h(M

)

{S

}

Alicja

Niezaprzeczalność

• Podpis elektroniczny zapewnia

niezaprzeczalność

• Alicja wysyła M oraz S = [h(M)]

Alicja

do Boba

• Alicja nie może “wyprzeć się” podpisu

– Alicja nie może obronić twierdzenia, że nie

podpisała M

• Jak to działa?
• Czy tak samo jak dla MAC?

Niezaprzeczalność

• Alicja zamawia 100 laptopów u Boba
• Alicja oblicza

MAC

korzystając z klucza

symetrycznego

• Znajduje tańszą ofertę, Alicja twierdzi, że nie

składała zamówienia

• Czy Bob może udowodnić Alicji kłamstwo?

Nie!

Ponieważ Bob również zna klucz

symetryczny, mógł zatem sfałszować zamówienie

Problem

:

Bob wie, że Alicja złożyła zamówienie

i nie może tego udowodnić

background image

2014-04-15

4

Niezaprzeczalność

• Alicja zamawia 100 laptopów u Boba
• Alicja

podpisuje

zamówienie korzystając z

klucza prywatnego

• Znajduje tańszą ofertę, Alicja twierdzi, że

nie składała zamówienia

• Czy Bob może udowodnić Alicji kłamstwo?

Tak!

Tylko ktoś kto zna klucz prywatny Alicji

mógł złożyć podpis

• Jeżeli nikt go nie ukradł Alicji to jest jedną

osobą, która mogła to zrobić

Skróty i podpisy

• Alicja podpisuje h(M), wysyła M oraz

S = [h(M)]

Alicja

do Boba oraz Bob weryfikuje

h(M) = {S}

Alicja

• Bezpieczeństwo zależy od bezpieczeństwa

kryptosystemu klucza publicznego

i od

bezpieczeństwa funkcji skrótu

• Niech Intruz znajdzie kolizję: M



M taką, że

h(M

) = h(M)

• Wtedy Intruz może zamienić M na M

i

schemat podpisu jest złamany

Projekt kryptograficznej funkcji
skrótu

• Pożądana własność:

efekt lawinowy

– Zmiana dowolnego bitu powoduje zmianę około

dużej liczby bitów skrótu

• Kryptograficzne funkcje skrótu składają się z

kilku rund (analogicznie jak algorytmy
blokowe w trybie CBC)

• Potrzebujemy bezpieczeństwa i prędkości

– Efekt lawinowy po kilku rundach
– Lecz runda musi być prosta

Projekt kryptograficznej funkcji
skrótu

• Dane wejściowe rozbijane na bloki

Kompresja

stosowana względem bloków

• Wartość bloku zależna od obecnej

wartości i od wyjścia poprzedniej rundy

– Wyjście z ostatniej rundy jest wartością

skrótu

• Dla funkcji skrótu rozważamy:

– Rozmiar bloku 512 bit
– Kompresja bloku wyjściowego 128 bit

Funkcja skrótu

• Wejście lub

“wiadomości” w
blokach
M

0

,M

1

,…,M

N

1

• Dodatkowo mod 2

32

na 32-bit słowie

Schemat Merkle-

Damgard

Funkcje skrótu: ciekawostki

• Jeżeli wiadomość jest długości pojedynczego

bloku 512-bit : h(M) = f(IV,M) gdzie f oraz IV
znane Intruzowi

• Dla 2 bloków:
h(M) = f(f(IV,M

0

),M

1

) = f(h(M

0

),M

1

)

• Ogólnie

h(M) = f(h(M

0

,M

1

,…,M

n

2

),M

n

1

)

– Jeżeli h(M) = h(M

) wtedy h(M,X) = h(M

,X) dla

dowolnego X

background image

2014-04-15

5

HMAC

• MAC: algorytm blokowy dla integralności

– Czy możemy użyć funkcji skrótu?

• “hashed MAC”,

HMAC

, wiadomości M z

kluczem K

– Dlaczego potrzebujemy klucza?

• Jak obliczyć HMAC?

– Dwa oczywiste podejścia:

h(K,M) and h(M,K)

• Które (czy w ogóle) jest lepsze?

Jak obliczyć HMAC?

• Czy mamy obliczać HMAC jako h(K,M) ?
• Skróty obliczane w blokach
• Przypominamy: h(M

0

,M

1

) = F(h(M

0

),M

1

)

• Niech M

= (M,X)

– Wtedy h(K,M

) = F(h(K,M),X)

– Intruz może obliczyć HMAC z M

bez

znajomości K

– Kompromituje to HMAC

Jak obliczyć HMAC?

• Czy powinniśmy obliczać HMAC jako

h(M,K) ?

– Lepsze niż h(K,M) ?

• Jeżeli h(M

) = h(M) wtedy

h(M,K) = F(h(M),K) = F(h(M

),K) = h(M

,K)

• W tym przypadku, Intruz nie może

obliczyć HMAC bez znajomości K

– Lecz musi znać kolizje
– Lepsze niż h(K,M), lecz wciąż może być

lepiej

Właściwy sposób na HMAC

• Opisany w RFC 2104
• Niech B będzie długością w bajtach bloku

funkcji skrótu

• Dla popularnych funkcji B = 64

– SHA-1, MD5, Tiger, etc.

• Definiujemy
ipad = 0x36 (00110110) powtarzany B razy

opad = 0x5C (01011100) powtarzany B razy
• Wtedy

HMAC(M,K) = H(K

opad, H(K

ipad, M))

Algorytm MD5

• Algorytm MD5 (ang. Message Digest) został opracowany

przez Rona Rivesta i opublikowany jako RFC1321

• Algorytm z wejściowego komunikatu o dowolnej długości

generuje 128-bitowy skrót

• Dane wejściowe przetwarzane są w 512 bitowych

blokach

• Przykład działania
• MD5("Ala ma kota") =

91162629d258a876ee994e9233b2ad87

• MD5("Ala ma koty") =

6a645004f620c691731b5a292c25d37f

Dodawanie bitów dopełniających

• Komunikat jest dopełniany tak, by jego długość w bitach

przystawała do 448 modulo 512

• Czyli długość komunikatu musi być o 64 bity mniejsza niż

całkowita wielokrotność 512 bitów

• Na przykład jeżeli komunikat ma 2345 bitów to

najbliższa wielokrotność 512 bitów to 2560, więc
komunikat zostanie dopełniony do 2496 bitów

• Dopełnienie dodaje się zawsze, nawet gdy komunikat ma

żądaną długość

• Dopełnienie składa się z bitu 1, po którym następuje

odpowiednia liczba bitów 0

background image

2014-04-15

6

Dodanie długości komunikatu

• Do komunikatu uzupełnionego o dopełnienie dodaje się

64-bitową reprezentację długości pierwotnego
komunikatu w bitach (przed dopełnieniem)

• Jeżeli komunikat jest dłuższy niż 2

64

to używa się tylko

młodszych 64 bitów długości

• To oznacza, że pole długości zawiera długość

początkowego komunikatu modulo 2

64

• Następnie cały komunikat wraz z dopełnieniem i

długością jest przetwarzany w blokach Y

0

, Y

1

,...,Y

L-1

, o

długości 512 bitów

Inicjalizacja bufora MD

• Do przechowywania pośrednich i końcowych wartości

funkcji skrótu stosuje się bufor 128-bitowy

• Bufor ten można zapisać jako cztery 32-bitowe rejestry

oznaczane jako A, B, C, D

• Rejestry te są na początku inicjalizowane następującymi

wartościami szesnastkowymi (najpierw młodsze oktety):

A=01234567

B=89ABCDEF
C
=FEDCBA98

D=76543210

Generowanie wyciągu w MD5

Komunikat

K bitów

L

x 512 bitów=N x 32 bity

Dopełnienie

(1-512) bitów

Długość

komunikatu
(K mod 2 )

64

100...0

Y

0

Y

1

512 bitów

512 bitów

Y

q

512 bitów

Y

L-1

512 bitów

. . .

. . .

H

MD5

512

H

MD5

512

H

MD5

512

H

MD5

512

128

128

128

128

ABCD

128 bitowy wyciąg

Przetwarzanie komunikatu w 512-
bitowych blokach

• Wszystkie 4 etapy mają

podobną strukturę, lecz każdy

korzysta z innej elementarnej

funkcji logicznej oznaczanej w

specyfikacji jako F, G, H, I

• W każdym etapie jest

przetwarzany aktualny blok Y

q

oraz bufor ABCD (MD

q

)

• Dodatkowo w każdym etapie

korzysta się z kolejnych części

tablicy T[1,...,64]

skonstruowanej na podstawie

funkcji sinus

f (ABCD,Y ,T[1,...,16])

F

q

128

MD

q

A B C D

A B C D

32

f (ABCD,Y ,T[17,...,32])

G

q

A B C D

f (ABCD,Y ,T[33,...,48])

H

q

A B C D

f (ABCD,Y ,T[49,...,64])

I

q

512

Y

q

+

mod 2

32

+

mod 2

32

+

mod 2

32

+

mod 2

32

128

MD

q+1

Elementarna operacja MD5

• Każdy z kroków wykonywanych 64

razy dla każdego bloku ma postać

A

B+CLS

s

(A+g(B,C,D)+X[k]+T[i])

• Przez g oznaczamy jedną z funkcji

elementarnych F, G, H, I

• X[k] oznacza k-te 32 bitowe słowo

w przetwarzanym 512-bitowym

bloku

• T[i] oznacza i-te 32 bitowe słowo w

tablicy stałych

• Wszystkie dodawania są

realizowane modulo 2

32

A B C D

+

mod 2

32

g

+

mod 2

32

X[k]

+

mod 2

32

T[i]

CLS

s

+

mod 2

32

Elementarna operacja MD5

• Indeksy k do tablicy X oraz wartość przesunięcia s jest

zdefiniowana w RFC1321

• Elementarna operacja MD5 może być zapisana jako

[ABCD k s i]

• Dla etapów 1-16 A=B+CLS

s

(A+F(B,C,D)+X[k]+T[i])

[ABCD k s i] [DABC k s i] [CDAB k s i] [BCDA k s i]

[ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4]
[ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8]
[ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12]
[ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16]

background image

2014-04-15

7

Funkcje elementarne

D)

B

(

C)

(B

D)

C,

F(B,

)

D

(C

D)

(B

D)

C,

G(B,

D

C

B

D)

C,

H(B,

)

D

(B

C

D)

C,

I(B,

bity

Funkcje

elementarne

bity

Funkcje

elementarne

B

C

D

F

G

H

I

B

C

D

F

G

H

I

0

0

0

0

0

0

1

1

0

0

0

0

1

1

0

0

1

1

0

1

0

1

0

1

0

1

0

1

0

1

0

0

1

1

0

1

1

0

1

1

0

0

0

1

1

1

0

0

1

1

1

1

1

1

1

0

Algorytm SHA

• Algorytm SHA (ang. Secure hash algorithm) został

stworzony przez Narodowy Instytut Standardów i

Technologii USA (NIST) i opublikowany jako FIPS PUB

180 w 1993 roku

• Algorytm z wejściowego komunikatu o długości

mniejszej niż 2

64

bity generuje 160-bitowy wyciąg

• Dane przetwarzane są w 512 bitowych blokach
• Od 2001 powstały cztery warianty określane jako SHA-2

(SHA-224, SHA-256, SHA-384, SHA-512)

• Ponieważ w 2004 zgłoszono udane ataki na funkcje

skrótu mające strukturę podobną do SHA-1 NIST ogłosił,

że do 2010 zaprzestanie stosować SHA-1 na rzecz

różnych wariantów SHA-2

Generowanie skrótu w SHA

• Dodawanie bitów dopełniających
• Dodanie długości komunikatu , długość musi być mniejsza

niż 2

64

• Inicjalizacja 160-bitowego bufora MD

A=67452301 B=EFCDAB89 C=98BADCFE

D=10325476 E=C3D2E1F0

• Przetwarzanie komunikatu w blokach 512-bitowych
• Otrzymanie wyniku

Generowanie skrótu w SHA

Komunikat

K bitów (<2 bitów)

64

L

x 512 bitów=N

x 32 bity

Dopełnienie

(1-512) bitów

Długość

komunikatu

(K)

100...0

Y

0

Y

1

512 bitów

512 bitów

Y

q

512 bitów

Y

L-1

512 bitów

. . .

. . .

H

SHA

512

512

512

512

160

ABCDE

160 bitowy wyciąg

160

160

160

H

SHA

H

SHA

H

SHA

Przetwarzanie komunikatu w 512-
bitowych blokach

• Podstawowym elementem

algorytmu jest przetwarzanie
bloku 512 bitowego za pomocą
80 podobnych etapów

• W każdym etapie jest

przetwarzany aktualny blok Y

q

oraz bufor ABCDE (MD

q

)

• Dodatkowo w każdym etapie

korzysta się z zdefiniowanej
stałej addytywnej K

t

: 0

t

19

ETAP (ABCDE,Y ,K )

0

q

0

160

MD

q

A B C D E

512

Y

q

+

mod 2

32

+

mod 2

32

+

mod 2

32

+

mod 2

32

160

MD

q+1

32

A B C D E

A B C D E

ETAP (ABCDE,Y ,K )

1

q

1

ETAP (ABCDE,Y ,K )

79

q

79

+

mod 2

32

Elementarna operacja SHA

• Każdy z etapów wykonywanych

80 razy dla każdego bloku ma
postać

A, B, C, D, E

(CLS

5

(A)+f

t

(B,C,D)+E+W

t

+K

t

), A,

CLS

30

(B), C, D

• Przez f

t

oznaczamy jedną z

funkcji elementarnych

• W

t

oznacza 32 bitowe słowo w

przetwarzanym 512-bitowym
bloku

• K

t

to zdefiniowana stała

+

mod 2

32

f

t

+

mod 2

32

W

t

+

mod 2

32

CLS

30

A B C D E

+

mod 2

32

K

t

A B C D E

CLS

5

background image

2014-04-15

8

Funkcje elementarne

D)

B

(

C)

(B

D)

C,

(B,

f

19

0

t

t

D

C

B

D)

C,

(B,

f

39

20

t

t

D)

(C

D)

(B

C)

(B

D)

C,

(B,

f

59

0

4

t

t

D

C

B

D)

C,

(B,

f

79

60

t

t

Tworzenie sekwencji danych
wejściowych

• W

t

oznacza 32 bitowe słowo z przetwarzanego 512-

bitowym bloku

• Pierwsze 16 wartości W

t

otrzymuje się bezpośrednio z

aktualnego bloku 512-bitowego

• Pozostałe wartości są definiowane według

W

t

=W

t-16

W

t-14

W

t-8

W

t-3

. . .

Y

q

32

512 bitów

W

0

W

1

32

32

W

15

32

W

16

W

0

W W W

2

8

13

32

W

t

XOR

W

t-16

W W W

t

t

t

-14

-8

-3

XOR

32

W

79

XOR

W

63

W W W

65

71

13

. . .

. . .

Porównanie MD5 i SHA

MD5

SHA

Długość skrótu

128 bitów

160 bitów

Podstawowa jednostka

przetwarzania

512 bitów

512 bitów

Liczba kroków

64

80

Maksymalny rozmiar

komunikatu

2

64

Elementarne funkcje logiczne

4

3

Zastosowanie stałych

addytywnych

64

4

Porównanie MD5 i SHA

Bezpieczeństwo – SHA daje dłuższy skrót, co zapewnia

większe bezpieczeństwo

Szybkość – oba algorytmy działają podobnie. Jednak

ponieważ SHA ma dłuższy bufor działa około 25% wolniej
niż MD5

Prostota i poręczność – SHA posiada prostszą strukturę
Architektura – MD5 interpretuje komunikat jako

sekwencje 32-bitowych słów zapisanych w architekturze
little-endian”, SHA stosuje architekturę „big-endian

Bezpieczeństwo SHA

• Złożoność obliczeniowa ataku metodą brutalnej siły dla

wykrycia kolizji (wykrycie dwóch wiadomości, których

wynikiem jest ta sama funkcja skrótu) wynosi dla SHA

2

80

• Kryptologom udało się opracować atak, którego

złożoność obliczeniowa wynosi 2

69

• W związku z tym pojawiły się wątpliwości co do

bezpieczeństwa wielu systemów kryptograficznych

używających SHA (np. system podpisu elektronicznego)

• Narodowy Instytut Standardów i Technologii (NIST)

zaproponował zastąpienia szeroko używanej funkcji

haszującej SHA-1 silniejszą i mocniejszą funkcją SHA-

256 lub SHA-512

Najważniejsze cechy SHA-256

• SHA-256 daje skrót w długości 256 bitów co podnosi

znacznie bezpieczeństwo skrótu

• Dane wejściowe przetwarzane są w 512 bitowych

blokach

• Generalna zasada działania SHA-256 jest bardzo podobna

do MD5 i SHA

• Zastosowano inne funkcje na etapie przetwarzania

pojedynczych 512-bitowych bloków

background image

2014-04-15

9

Najważniejsze cechy SHA-512

• SHA-512 daje 512 bitowy skrót. Dane wejściowe

przetwarzane są w 1024 bitowych blokach

• Komunikat jest dopełniany tak, by jego długość w bitach

przystawała do 896 modulo 1024

• Odpowiednio jak dla SHA-256 wprowadzono nowe

funkcje przetwarzające dane


SHA-3 - Algorytm Keccak







Architektura gąbki

SHA-3 - Algorytm Keccak

SHA-3 - Algorytm Keccak

SHA-3 - Algorytm Keccak



Dziękuję za uwagę


Wyszukiwarka

Podobne podstrony:
Ataki na kryptograficzne funkcje skrótu
9 Kryptoanaliza funkcji skrotu 2014
Funkcje skrótu v2
Kryptoanaliza funkcji skrótu
BANK CENTRALNY I JEGO FUNKCJE
Zaburzenia funkcji zwieraczy
Genetyka regulacja funkcji genow
BYT 2005 Pomiar funkcjonalnosci oprogramowania
Diagnoza Funkcjonalna
Insulinoterapia funkcjonalna
Postać kanoniczna funkcji kwadratowej
Wpływ choroby na funkcjonowanie rodziny

więcej podobnych podstron