21.04.2015 Views

Opis CryptoAPI.pdf

Opis CryptoAPI.pdf

Opis CryptoAPI.pdf

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

3 ROZDZIA<br />

Biblioteka <strong>CryptoAPI</strong><br />

Poniszy rozdzia „Analiza biblioteki <strong>CryptoAPI</strong>” ma na celu objanienie<br />

uytkownikowi, czym tak naprawd jest wspomniana biblioteka, jakie moliwoci<br />

posiada oraz w jakim stopniu przydatna bdzie przy projektowaniu aplikacji oraz<br />

podczas póniejszych implementacji.<br />

3.1 <strong>Opis</strong> biblioteki <strong>CryptoAPI</strong><br />

Biblioteka <strong>CryptoAPI</strong> jest interfejsem programowania aplikacji (ang.<br />

Application Programing Interface – API 47 ) udostpnianym jako cz systemu<br />

Microsoft Windows. Interfejs <strong>CryptoAPI</strong> dostarcza zestaw funkcji, które pozwalaj<br />

aplikacjom wykorzystywa metody kryptograficzne podnoszce bezpieczestwo<br />

aplikacji, zapewniajc jednoczenie ochron prywatnych danych uytkowników. 48<br />

Systemy z rodziny Windows byy wyposaone w pakiet <strong>CryptoAPI</strong> poczwszy od<br />

wersji 95 oraz NT 4.0 z zainstalowanym produktem (przegldark internetow) Internet<br />

Explorer w wersji 4.0.<br />

W systemie Windows NT 4.0 znalazy si pierwsze elementy, pozwalajce na<br />

korzystanie z zabezpiecze za pomoc klucza publicznego w skad których wchodz:<br />

interfejs <strong>CryptoAPI</strong>, wspomagajcy programist w zakresie generowania i<br />

wymiany kluczy, podpisów elektronicznych oraz szyfrowania danych, za<br />

pomoc architektury usugodawcy do obsugi instalowalnych usugodawców<br />

kryptograficznych,<br />

obsuga certyfikatów X.509 i standardów PKCS przez interfejs <strong>CryptoAPI</strong>. 49<br />

47 Zestaw procedur, których uywa aplikacja, aby da i korzysta z usug niszego poziomu<br />

wykonywanych przez system operacyjny komputera. Procedury te dotycz zwykle zada konserwacji, na<br />

przykad zarzdzania plikami i wywietlania informacji.<br />

ródo: http://centrumxp.pl/slownik/index.php?def=dc_api<br />

48 http://centrumxp.pl/slownik/index.php?def=cryptoapi<br />

49 Ian McLean, „Bezpieczestwo W Windows 2000.Czarna Ksiga”<br />

36


Kiedy w systemie Windows NT 4.0 wprowadzono do interfejsu <strong>CryptoAPI</strong><br />

systemow obsug kryptografii (ang. low-level cryptography support) i moduowych<br />

usugodawców usug kryptograficznych (ang. modular Cryptographic Service<br />

Providers) moliwe stao si uycie zabezpiecze opartych na kryptografii. Rozwinity<br />

system Windows 2000 korzysta ju z wprowadzenia do interfejsu <strong>CryptoAPI</strong><br />

zarzdzania certyfikatami (ang. <strong>CryptoAPI</strong> Certificate Management) w celu obsugi<br />

zabezpiecze wykorzystujcych klucz publiczny.<br />

<br />

<br />

<br />

<br />

Wród nowych cech interfejsu <strong>CryptoAPI</strong> s m.in.:<br />

obsuga certyfikatów w standardzie X.509 v.3 oraz list uniewaniania<br />

certyfikatów (ang. CRLs) w standardzie X.509 v.2 poprzez wspólne funkcje<br />

kodowania-dekodowania, analiz syntaktyczn (ang. parsing) certyfikatów oraz<br />

weryfikacj,<br />

obsuga da certyfikatów PKCS#10 50 i PKCS #7 51 dla danych podpisanych<br />

(ang. signed data) i danych opakowanych (ang. enveloped data),<br />

zdolno do dodawania i odzyskiwania certyfikatów oraz list uniewaniania<br />

certyfikatów ze skadów certyfikatów (ang. certificate stores), lokalizacji<br />

certyfikatów wedug atrybutów i przydzielania kluczy prywatnych,<br />

obsuga weryfikowania podpisu cyfrowego (ang. digital signature) i<br />

szyfrowania danych za pomoc funkcji wyszego poziomu dostpnych dla<br />

aplikacji uytkowych napisanych w HTML-u, Javie, Visual Basic-u (Scripting<br />

Edition — VBScript) i C/C++. 52<br />

Aktualnie, <strong>CryptoAPI</strong> w wersji 2 mog wykorzystywa aplikacje dostosowane<br />

do systemów Microsoft Windows NT, Microsoft Windows oraz Microsoft Windows<br />

Server 2003.<br />

Twórcy aplikacji mog uywa funkcji <strong>CryptoAPI</strong>, w celu dodania do<br />

oprogramowania zabezpiecze opartych na szyfrowaniu i deszyfrowaniu algorytmami<br />

symetrycznymi i asymetrycznymi, uwierzytelnianiu przy uyciu cyfrowych<br />

certyfikatów, generowaniu funkcji skrótu - bez szczegóowej znajomoci implementacji<br />

50 PKCS#10 v1.7: Certification Request Syntax Standard, RSA Laboratories, 26.05.2000 r.<br />

51 PKCS#7 v1.5 Cryptographic Message Syntax, RSA Laboratories, 01.11.1993 r.<br />

52 Ian McLean, „Bezpieczestwo W Windows 2000.Czarna Ksiga”<br />

37


poszczególnych operacji kryptograficznych, poniewa aplikacja wykorzystujca funkcje<br />

kryptograficzne ma do dyspozycji gotowe mechanizmy. Wszystkie operacje<br />

wykonywane s za porednictwem dostawców usug kryptograficznych (ang.<br />

Cryptographic Service Providers - CSP). S to niezalene moduy (istnieje moliwo<br />

rozbudowania systemu o dodatkowe moduy dostawców), zawierajce gotowe<br />

implementacje algorytmów kryptograficznych jak równie zarzdzajce kluczami<br />

uytkownika. Wynika wic, e <strong>CryptoAPI</strong> jest interfejsem pomidzy aplikacj a<br />

wybranym dostawc usug kryptograficznych.<br />

3.1.1 Architektura <strong>CryptoAPI</strong><br />

Rysunek 3.1 Architektura <strong>CryptoAPI</strong><br />

ródo: Platform SDK: Cryptography, „<strong>CryptoAPI</strong> System Architecture”,<br />

http://msdn.microsoft.com/library/en-us/seccrypto/security/cryptoapi_system_architecture.asp<br />

38


W ogólnej architekturze <strong>CryptoAPI</strong> (rys. 3.1) naley wyróni trzy warstwy:<br />

1) warstwa aplikacji - w tej najwyszej warstwie dziaa aplikacja,<br />

wykorzystujca mechanizmy kryptograficzne;<br />

2) warstwa systemowa - jest stykiem aplikacji z systemem, udostpnia operacje<br />

kryptograficzne wykorzystywane przez aplikacj;<br />

3) warstwa dostawców usug kryptograficznych - zawiera moduy dostawców<br />

usug kryptograficznych, które wykonuj waciwe operacje szyfrowania,<br />

podpisywania i generowania kluczy.<br />

Ogromn zalet tej architektury jest moliwo wymiany i wyboru rónych<br />

dostawców, dziki czemu uzyskuje si niezaleno od konkretnej realizacji i<br />

nieograniczone moliwoci rozszerzania <strong>CryptoAPI</strong> o nowe implementacje algorytmów<br />

czy urzdze kryptograficznych w taki sposób, e sama aplikacja korzystajca z tego<br />

mechanizmu nie wymaga modyfikacji. Wspópraca np. z kryptograficznymi kartami<br />

elektronicznymi (ang. smart card 53 ) realizowana jest wanie za pomoc podczenia<br />

odpowiedniego moduu CSP dostarczanego wraz z konkretn implementacj karty i<br />

czytnika. 54<br />

Jak wynika z trójwarstwowej architektury biblioteki <strong>CryptoAPI</strong>, najwaniejsz i<br />

najbardziej zoon warstw jest warstwa systemowa skadajca si z nastpujcych<br />

podstawowych obszarów funkcyjnych:<br />

1) Podstawowe funkcje kryptograficzne (ang. base bryptographic functions)<br />

- zwane inaczej funkcjami kontekstowymi, tylko przy pomocy tych funkcji<br />

moliwe jest odwoanie si do dostawców usug kryptograficznych i wybór<br />

specyficznego dostawcy, speniajcego wymagan funkcjonalno.<br />

Zawieraj take funkcje generujce klucze - uywane do tworzenia i<br />

przechowywania kluczy kryptograficznych jak równie do ich wymiany i<br />

transmisji.<br />

53 Urzdzenie o wielkoci karty kredytowej, które dziki kodowi dostpu jest uywane do<br />

uwierzytelniania opartego na certyfikatach i skróconej rejestracji w zrzeszeniu. Karty inteligentne<br />

zapewniaj bezpieczne przechowywanie certyfikatów, kluczy publicznych i prywatnych, hase i<br />

informacji osobistych innego typu. Karta inteligentna jest odczytywana przez podczony do komputera<br />

czytnik kart inteligentnych.<br />

ródo: http://centrumxp.pl/slownik/index.php?def=smart_card<br />

54 http://www.polcert.pl/biuletyn/index_11.html<br />

39


2) Funkcje kodowania/dekodowania certyfikatów (ang. certificate<br />

encode/decode functions) – uywane podczas szyfrowania i deszyfrowania<br />

danych;<br />

3) Funkcje magazynu certyfikatów (ang. certificate store functions) -<br />

uywane do zarzdzania zbiorami cyfrowych certyfikatów, umoliwiaj<br />

sprawdzanie certyfikatów zawartych w dokumentach;<br />

4) Uproszczone funkcje wiadomoci (ang. simplified message functions) -<br />

grupa funkcji wysokiego poziomu, sucych do tworzenia i korzystania z<br />

kluczy, do szyfrowania i deszyfrowania, skadania oraz weryfikacji<br />

cyfrowych podpisów;<br />

5) Niskopoziomowe funkcje wiadomoci (ang. low level message functions) –<br />

funkcje uywane podczas wszystkich zada wykonywanych przez<br />

uproszczone funkcje wiadomoci, umoliwiaj wiksz kontrol nad<br />

wykonywanymi operacjami ale wymagaj wikszej iloci wywoa funkcji..<br />

Aplikacja komunikuje si z kadym z powyszych obszarów, nie moe jednak<br />

bezporednio komunikowa si z moduami CSP. Taki rodzaj komunikacji odbywa si<br />

zawsze przy pomocy obszaru podstawowych funkcji kryptograficznych, poprzez które<br />

przekazywany jest parametr odpowiedniego moduu CSP do wykorzystania.<br />

3.2 Dostawcy usug kryptograficznych<br />

Dostawcy usug kryptograficznych dostarczaj rónorodnych implementacji<br />

kryptograficznych, niektóre oferuj silne algorytmy inne przystosowane s do pracy z<br />

komponentami sprztowymi, takimi jak karty elektroniczne. Moduy dostawców usug<br />

kryptograficznych zawieraj implementacje algorytmów i standardów<br />

kryptograficznych, aplikacja jednak w aden sposób nie komunikuje si z nimi<br />

bezporednio - w zamian, aplikacja wywouje funkcje <strong>CryptoAPI</strong> udostpnione przez<br />

system operacyjny, który filtruje te wywoania i przekazuje je do odpowiednich<br />

moduów CSP poprzez interfejs CryptoSPI (ang. System Program Interface - SPI),<br />

zgodnie ze schematem na rys. 3.2.<br />

40


Dostp, jaki aplikacje posiadaj do CSP jest starannie zaplanowany i obejmuj<br />

go nastpujce restrykcje:<br />

aplikacje nie maj bezporedniego dostpu do kluczowych elementów CSP,<br />

uywaj jedynie „przezroczystych” deskryptorów, nie istnieje wic ryzyko<br />

uszkodzenia CSP;<br />

aplikacje nie okreslaj detali operacji kryptograficznych, interfejs CSP pozwala<br />

aplikacji wybra algorytm kryptograficzny, ale implementacja kadej operacji<br />

kryptograficznej jest opisana i dokonywana w CSP;<br />

aplikacje nie przechowuj dokumentów zwizanych z tosamoci uytkownika,<br />

np. hasa i wszystkie operacje uwierzytelniajce wykonywane s poprzez CSP.<br />

Rysunek 3.2 Architektura CSP<br />

ródo: Platform SDK: Cryptography, “CSP Architectural Overview”,<br />

http://msdn.microsoft.com/library/en-us/seccrypto/security/csp_architectural_overview.asp<br />

Moduy CSP przechowuj pary kluczy prywatnych i publicznych uywanych<br />

pomidzy sesjami w pamici trwaej, w zalenoci od implementacji - programowej lub<br />

sprztowej - odpowiednio w postaci zaszyfrowanej w rejestrze systemu lub w<br />

przystosowanym do tego sprzcie. Pary kluczy przechowywane s w obiektach<br />

nazywanych kontenerami kluczy (ang. key containers), modu CSP zawiera po jednym<br />

41


kontenerze dla kadego uytkownika, który korzysta z dostawcy usug<br />

kryptograficznych. Kady kontener kluczy moe przechowywa jedn par kluczy<br />

wspieran przez danego dostawc.<br />

Klucze sesyjne (oraz opisane póniej wartoci funkcji skrótu) natomiast<br />

utrzymywane s w pamici ulotnej, po kadym zakoczeniu sesji musz zosta<br />

zniszczone. Istnieje jednak sposób na przechowywanie kluczy sesyjnych pomidzy<br />

sesjami. Aplikacja moe wyeksportowa klucz z bazy kluczy CSP do specjalnej formy<br />

przechowywania nazwanej KeyBLOB 55 . Jest to zaszyfrowana posta klucza, która moe<br />

by przechowywana poza moduem CSP, utworzona przy pomocy okrelonej funkcji<br />

<strong>CryptoAPI</strong> (rozdz. 3.3.3.3). Istniej trzy podstawowe formy KeyBLOB, pierwsza<br />

nazwana Public KeyBLOB - suca do przechowywania jednego z pary kluczy<br />

asymetrycznych, czyli klucza publicznego, druga nazwana Private KeyBLOB -<br />

suca do przechowywania kompletnej pary kluczy asymetrycznych, oraz trzecia<br />

nazwanaSimple KeyBLOB, której zadaniem jest przechowywanie klucza sesyjnego.<br />

Kady z dostawców usug kryptograficznych posiada baz kluczy (rys. 3.3).<br />

Kada baza kluczy zawiera jeden lub wicej kontenerów z kluczami dla danego<br />

uytkownika. Kady kontener posiada unikalna nazw (najczciej jest to nazwa danego<br />

uytkownika w systemie), któr aplikacja przekazuje w czasie dziaania, jako argument<br />

do specjalnej funkcji w celu uzyskania poczenia z danym kontenerem.<br />

55 Kady dostawca okrela swoj wasn struktur formy KeyBLOB<br />

42


Rysunek 3.3 Zawarto bazy danych kluczy<br />

ródo: Robert Coleridge, „The Cryptography API, or How to Keep a Secret”,<br />

http://msdn.microsoft.com/library/en-us/dncapi/html/msdn_cryptapi.asp?frame=true<br />

3.2.1 Typy dostawców usug kryptograficznych<br />

Istnieje wiele rónych standardów formatów danych oraz protokoów, które<br />

zazwyczaj zorganizowane s w grupy bd rodziny, kada z nich o ustalonych<br />

formatach danych oraz sposobach obchodzenia si z nimi. Nawet, gdy dwie rodziny<br />

uywaj tego samego algorytmu, np. RC2 - czsto uywaj go w rónych trybach, z<br />

kluczami o rónej dugoci. <strong>CryptoAPI</strong> zaprojektowane jest w ten sposób, by dostawca<br />

usug kryptograficznych reprezentowa okrelon rodzin.<br />

Gdy aplikacja czy si z okrelonym typem CSP, kada z funkcji <strong>CryptoAPI</strong><br />

bdzie uywana wedug sposobu opisanego w okrelonym CSP. Aplikacja wybiera<br />

dostawc specyfikujc okrelone cechy przedstawione w tab. 3.1:<br />

Cecha<br />

Algorytm wymiany klucza<br />

Algorytm cyfrowego podpisu<br />

Format KeyBLOB<br />

<strong>Opis</strong><br />

Kady z dostawców specyfikuje jeden i tylko jeden algorytm<br />

wymiany kluczy. Kady CSP okrelonego typu musi mie<br />

zaimplementowany ten algorytm.<br />

Kady z dostawców specyfikuje jeden i tylko jeden algorytm<br />

wymiany kluczy. Kady CSP okrelonego typu musi mie<br />

zaimplementowany ten algorytm.<br />

Typ dostawcy okrela format struktury KeyBLOB uywanej do<br />

43


Format cyfrowego podpisu<br />

Schemat uzyskiwania klucza<br />

sesyjnego<br />

Dugo klucza<br />

Tryby domylne<br />

eksportowania kluczy z CSP i do importowania ich do CSP<br />

Typ dostawcy okrela format cyfrowego podpisu. Zapewnia to<br />

kompatybilno w tworzeniu i weryfikowaniu podpisu przez CSP<br />

tego samego typu.<br />

Typ dostawcy okrela metod uywan do uzyskania klucza<br />

sesyjnego z wartoci funkcji skrótu.<br />

Typ dostawcy specyfikuje dugo kluczy publicznych i<br />

prywatnych oraz kluczy sesyjnych<br />

Typ dostawcy czsto specyfikuje domylny tryb rónych opcji,<br />

takich jak tryb szyfrowania.<br />

Tabela 3.1 <strong>Opis</strong> cech wg których aplikacja wybiera dostawc CSP<br />

ródo: Opracowanie wasne na podstawie http://msdn.microsoft.com/library/en-us/seccrypto/security/<br />

Obecnie istniej nastpujce predefiniowane typy dostawców usug<br />

kryptograficznych (istnieje take czciowa kompatybilno pomidzy typami<br />

dostawców naley jednak uywa jednego z typów w ramach na przykad wymiany<br />

kluczy pomidzy aplikacjami):<br />

1. PROV_RSA_FULL - wspiera cyfrowe podpisywanie oraz szyfrowanie<br />

danych, co uwaane jest za gówny cel CSP. Do wszystkich operacji na<br />

kluczach publicznych uywany jest algorytm klucza publicznego RSA<br />

2. PROV_RSA_AES wspiera cyfrowe podpisywanie oraz szyfrowanie<br />

danych, co uwaane jest za gówny cel CSP. Do wszystkich operacji na<br />

kluczach publicznych uywany jest algorytm klucza publicznego RSA<br />

3. PROV_RSA_SIG jest podtypem PROV_RSA_FULL. Wspiera jedynie<br />

funkcje i algorytmy potrzebne do funkcji skrótu oraz cyfrowych podpisów<br />

4. PROV_RSA_SCHANNEL wspiera protokoy RSA oraz Schannel<br />

5. PROV_DSS podobnie jak PROV_RSA_SIG wspiera jedynie funkcje skrótu<br />

oraz cyfrowe podpisy<br />

6. PROV_DSS_DH jest podtypem PROV_DSS<br />

7. PROV_DH_SCHANNEL wspiera protokoy Diffie-Hellman oraz Schannel<br />

8. PROV_FORTEZZA zawiera zestaw protokoów kryptograficznych i<br />

algorytmów stworzonych przez NIST (ang.NationalInstitute od Standards<br />

andTechnology)<br />

9. PROV_MS_EXCHANGE jest zaprojektowany na potrzeby kryptograficzne<br />

programów pocztowych kompatybilnych z Microsoft Mail<br />

44


10. PROV_SSL wspiera protokó SSL (ang.SecureSockelLayer)<br />

Ponisza tab. 3.2 wyjania rónice w funkcjonalnoci rónych typów dostawców<br />

oraz wykorzystywane przez nie algorytmy wymiany kluczy, podpisywania cyfrowego,<br />

szyfrowania oraz wytwarzania wartoci funkcji skrótu.<br />

Typ dostawcy / Cel Wymiana<br />

kluczy<br />

Podpisywanie Szyfrowanie Funkcja<br />

skrótu<br />

PROV_RSA_FULL RSA RSA RC2, RC4 MD5, SHA<br />

PROV_RSA_AES RSA RSA RC2, RC4, AES MD5, SHA<br />

PROV_RSA_SIG Brak RSA Brak MD5, SHA<br />

PROV_RSA_SCHANNEL RSA RSA<br />

RC4, DES, Triple<br />

DES<br />

MD5, SHA<br />

PROV_DSS Brak DSS Brak MD5, SHA<br />

PROV_DSS_DH DH DSS CYLINK_MEK MD5, SHA<br />

PROV_DH_SCHANNEL DH DSS DES, Triple DES MD5, SHA<br />

PROV_FORTEZZA KEA DSS SkipJack SHA<br />

PROV_MS_EXCHANGE RSA RSA CAST MD5<br />

PROV_SSL RSA RSA Róne Róne<br />

Tabela 3.2 Rónice w funkcjonalnoci rónych typów dostawców usug kryptograficznych<br />

ródo: Opracowanie wasne na podstawie http://msdn.microsoft.com/library/enus/seccrypto/security/cryptographic_provider_types.asp<br />

3.2.2 Dostawcy usug kryptograficznych firmy Microsoft<br />

Nastpujcy dostawcy usug kryptograficznych s aktualnie udostpniani przez<br />

firm Microsoft (tab. 3.3):<br />

Dostawca<br />

Microsoft Base Cryptographic<br />

Provider<br />

Typ: PROV_RSA_FULL<br />

Nazwa: MS_DEF_PROV<br />

Microsoft Enhanced Cryptographic<br />

Provider<br />

<strong>Opis</strong><br />

Podstawowy zestaw kryptograficzny, dostarczany wraz z kad<br />

32-bitow wersj systemu Windows (wersje od NT do 2003 lub<br />

wyposaone w przegldark internetow IE w wersji najniej<br />

3.0). Zawiera implementacje algorytmów: RSA z kluczami o<br />

dugoci 512 bitów, RC2 i RC4 z kluczami o dugoci 40<br />

bitów.<br />

Microsoft Base Cryptographic Provider, zawiera te same<br />

implementacje algorytmów jednake o zwikszonej dugoci<br />

45


Typ: PROV_RSA_FULL<br />

Nazwa: MS_ ENHANCED_PROV<br />

Microsoft Strong Cryptographic<br />

Provider<br />

Typ: PROV_RSA_FULL<br />

Nazwa: MS_ENHANCED_PROV<br />

Microsoft AES Cryptographic<br />

Provider<br />

Typ: PROV_AES_FULL<br />

Nazwa: MS_ENH_RSA_AES_PROV<br />

Microsoft DSS Cryptographic<br />

Provider<br />

Typ: PROV_DSS<br />

Nazwa: MS_DEF_DSS_PROV<br />

Microsoft Base DSS i Diffie-<br />

Hellman Cryptographic Provider<br />

Typ: PROV_DSS_DH<br />

Nazwa: MS_DEF_DSS_DH_PROV<br />

Microsoft Base DSS i Diffie-<br />

Hellman/Schannel<br />

Provider<br />

Cryptographic<br />

Typ: PROV_DH_SCHANNEL<br />

Nazwa:<br />

MS_DEF_DH_SCHANNEL_PROV<br />

Microsoft<br />

Cryptographic Provider<br />

RSA/Schannel<br />

Typ: PROV_RSA_SCHANNEL<br />

Nazwa:<br />

MS_DEF_RSA_SCHANNEL_PROV<br />

kluczy: dla RSA 1024 bity a w przypadku RC2 i RC4 128<br />

bitów. Pozwala równie szyfrowa dane przy pomocy<br />

algorytmu Triple DES z dugociami kluczy 112 i 168 bitów.<br />

Rozszerzenie dostawcy Microsoft Base Cryptographic Provider<br />

dostpne w systemie Windows 2000 i póniejszych, zawiera<br />

wszystkie algorytmy dostawcy Enhanced ale uywa dugoci<br />

kluczy dostawcy Base<br />

Microsoft Enhanced Cryptographic Provider z wsparciem dla<br />

algorytmu szyfrowania AES<br />

Udostpnia Funkcja skrótu, podpisywanie danych, weryfikacj<br />

podpisów przy uyciu algorytmu SHA (ang. Secure Hash<br />

Algorithm) oraz DSS (ang. Digital Signature Standard)<br />

Zestaw DSS Cryptographic Provider wspierajcy take<br />

algorytm Diffie-Hellman przy wymianie kluczy, funkcji skrótu,<br />

podpisywaniu danych oraz weryfikacj podpisów przy uyciu<br />

SHA oraz SDD<br />

Wspiera: funkcja skrótu, podpisywanie danych przy pomocy<br />

DSS, generowanie kluczy D-H (Diffie-Hellman), ich wymian<br />

oraz eksport.<br />

Wspiera: funkcja skrótu, podpisywanie danych oraz<br />

weryfikacj podpisów.<br />

Tabela 3.3 Dostawcy usug kryptograficznych udostpnieni przez firm Microsoft<br />

ródo: Opracowanie wasne na podstawie http://msdn.microsoft.com/library/enus/seccrypto/security/microsoft_cryptographic_service_providers.asp<br />

Microsoft Base Cryptographic Provider jest domylnym dostawc<br />

usug kryptograficznych dostarczanym razem z <strong>CryptoAPI</strong> we wszystkich wersjach.<br />

Jego gównym celem jest umoliwienie szyfrowania danych oraz cyfrowego<br />

podpisywania. Do wszystkich operacji klucza publicznego uywany jest algorytm<br />

asymetryczny RSA. W celu wykorzystania dostawcy, naley si z nim poczy za<br />

pomoc funkcji CryptAcquireContext, która powinna dokadnie okrela<br />

46


wybranego dostawc za pomoc typu oraz nazwy dostawcy. Microsoft Base<br />

Cryptographic Provider opisany jest za pomoc nastpujcego typu oraz nazwy:<br />

typ dostawcy: PROV_RSA_FULL<br />

nazwa dostawcy: MS_DEF_PROV<br />

Dostawca Microsoft Enhanced Cryptographic Provider posiada<br />

potencja kryptograficzny podobny do dostawcy Microsoft Base Cryptographic<br />

Provider. Dostawca w wersji Enhanced zapewnia lepsze bezpieczestwo poprzez<br />

zastosowanie duszych kluczy oraz dodatkowe algorytmy kryptograficzne. W celu<br />

wykorzystania dostawcy, naley si z nim poczy za pomoc funkcji<br />

CryptAcquireContext, która powinna dokadnie okrela wybranego dostawc za<br />

pomoc typu oraz nazwy dostawcy. Microsoft Enhanced Cryptographic Provider<br />

opisany jest za pomoc nastpujcego typu oraz nazwy:<br />

typ dostawcy: PROV_RSA_FULL<br />

nazwa dostawcy: MS_ENHANCED_PROV<br />

Ponisza tab. 3.4 ukazuje rónice pomidzy dostawcami Base oraz Enhanced<br />

Cryptographic Provider firmy Microsoft, jak równie wykorzystywanym w<br />

niniejszej pracy dostawc Strong Cryptographic Provider, domylnym dla typu<br />

PROV_RSA_FULL:<br />

Algorytm Dugo klucza<br />

Base Provider<br />

Dugo klucza<br />

Strong Provider<br />

Dugo klucza Enhanced<br />

Provider (bity)<br />

(bity)<br />

(bity)<br />

RSA (podpisywanie) 512 1.024 1.024<br />

RSA (wymiana kluczy) 512 1.024 1.024<br />

RC2<br />

(szyfrowanie blokowe)<br />

40 128 128<br />

RC4 (szyfrowanie<br />

strumieniowe)<br />

40 128 128<br />

DES 56 56 56<br />

Triple DES (2 klucze) Brak 112 112<br />

Triple DES (3 klucze) Brak 168 168<br />

Tabela 3.4 Rónice pomidzy dostawcami Base, Strong i Enhanced Cryptographic Provider<br />

ródo: Opracowanie wasne na podstawie http://msdn.microsoft.com/library/enus/seccrypto/security/key_length_comparison.asp<br />

47


W standardowych instalacjach systemu Windows XP Professional, domylni<br />

dostawcy usug kryptograficznych wymienieni s w rejestrze systemu, w kluczu:<br />

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\<br />

]<br />

a typy dostawców w kluczu:<br />

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider<br />

Types\]<br />

Poniej dokonano analizy jednego z kluczy rejestru, w celu przedstawienia<br />

pierwszej metody zapoznania si z dostpnymi w systemie dostawcami usug<br />

kryptograficznych:<br />

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\<br />

Microsoft Base Cryptographic Provider v1.0]<br />

"SigInFile"=dword:00000000<br />

"Type"=dword:00000001<br />

"Image Path"="C:\WINDOWS\System32\rsaenh.dll"<br />

Z wartoci klucza rejestru wynika, i dostawca usug kryptograficznych o<br />

nazwie Microsoft Base Cryptographic Provider v1.0 zaimplementowany<br />

jest w pliku biblioteki dynamicznej DLL o ciece dostpu<br />

C:\WINDOWS\System32\rsaenh.dll<br />

Przygldajc si natomiast kluczowi opisujcemu typ dostawcy:<br />

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider<br />

Types\Type 001]<br />

"Name"="Microsoft Strong Cryptographic Provider"<br />

"TypeName"="RSA Full (Signature and Key Exchange)"<br />

Z opisu wynika, e typem dostawcy usug kryptograficznych jest Microsoft<br />

Strong Cryptographic Provider, wykorzystujcy algorytm asymetryczny RSA,<br />

mogcy suy zarówno do cyfrowego podpisywania jak równie do wymiany kluczy.<br />

48


3.3 Przygotowanie rodowiska<br />

programistycznego i podstawy<br />

programowania z wykorzystaniem biblioteki<br />

<strong>CryptoAPI</strong><br />

Wykorzystanie interfejsu <strong>CryptoAPI</strong>, podczas projektowania aplikacji<br />

wykorzystujcych metody kryptograficzne, zwizane jest z poznaniem dostpnych<br />

funkcji biblioteki oraz ich moliwoci. Jak kady interfejs API take biblioteka<br />

kryptograficzna firmy Microsoft posiada zestaw funkcji udostpnionych<br />

uytkownikom, w tym przypadku funkcji przygotowanych do wyposaenia aplikacji w<br />

zabezpieczenia oparte na kryptografii. Uytkownik uywajcy rónorodnych gotowych<br />

funkcji nie jest zobowizany do szczegóowej znajomoci ich implementacji, jednake<br />

zobowizany jest do zapoznania si z ich podstawowymi cechami i parametrami w celu<br />

odpowiedniego ich zastosowania. W zalenoci od wymaganego przez uytkownika<br />

poziomu bezpieczestwa odpowiednio naley dobra metody kryptograficzne, czyli np.<br />

algorytmy lub rozmiary kluczy.<br />

3.3.1 Przygotowanie rodowiska programistycznego<br />

Istniej dwie podstawowe biblioteki dynamiczne DLL, których uywa si<br />

podczas korzystania z interfejsu <strong>CryptoAPI</strong>. Pierwsz z nich, pozwalajc na dostp do<br />

podstawowych funkcji kryptograficznych, takich jak funkcje szyfrujce i deszyfrujce,<br />

jest biblioteka advapi32.dll. Drug natomiast jest biblioteka crypt32.dll - która<br />

odpowiada za zarzdzanie certyfikatami, oraz zapewnia dostp do prostych oraz<br />

niskopoziomowych funkcji wiadomoci. Aplikacje korzystaj z tych bibliotek w<br />

momencie, gdy odwouj si do moduów CSP, nigdy jednak nie odwouj si do tych<br />

moduów bezporednio. Modu CSP zawierajcy implementacj standardów i<br />

algorytmów kryptograficznych take zbudowany jest w formie biblioteki dynamicznej<br />

DLL.<br />

49


Praca z <strong>CryptoAPI</strong> zawsze odbywa si w pewien schematyczny sposób, na<br />

pocztku zawsze musi zosta ustanowiony kontekst, czyli sesja pomidzy <strong>CryptoAPI</strong> a<br />

aplikacj, Aby ustali ten kontekst, naley przekaza nazw kontenera z kluczami oraz<br />

nazw dostawcy, z którym chcemy si poczy. Uzyskujemy w ten sposób deskryptor,<br />

którego uywamy w póniejszych wywoaniach funkcji. Aby rozpocz szyfrowanie<br />

lub deszyfrowanie zawsze potrzebny bdzie klucz sesyjny, który jak sama nazwa<br />

wskazuje ma okrelon ywotno ograniczon do tylko jednej sesji. Jak ju wczeniej<br />

wspomniano, aby zachowa klucz sesyjny na wicej ni jedn sesj konieczne jest<br />

wyeksportowanie go do bezpiecznej struktury KeyBLOB, która jest zbiorem danych<br />

które reprezentuj zaszyfrowan wersj klucza sesyjnego. Kade rozpoczcie<br />

korzystania z moduów dostawcy usug kryptograficznych musi zakoczy si<br />

specjalnym wywoaniem koczcym korzystanie, podobnie - w celach<br />

zabezpieczajcych przed niepowoanym dostpem do tajnych obiektów - jest w<br />

przypadku kluczy i innych obiektów. 56<br />

Rozwiniciem powyszego wstpu jest dalsza cz tego rozdziau, który<br />

powinien by traktowany jako wstp do nauki programowania za pomoc pakietu<br />

<strong>CryptoAPI</strong>. Poszczególne podrozdziay opisuj typowe zagadnienia kryptograficzne<br />

przedstawiajc je w schematyczny sposób oraz naprowadzajc czytajcego na gotowe<br />

implementacje okrelonych funkcji, wykorzystywanych do wykonania danych operacji<br />

oraz pomocnych podczas projektowania aplikacji kryptograficznych.<br />

3.3.1.1 Uzyskiwanie i zwalnianie deskryptora kontekstu do CSP<br />

Aplikacje korzystajce, poprzez interfejs <strong>CryptoAPI</strong>, z algorytmów i<br />

mechanizmów kryptograficznych zawartych w moduach dostawców usug<br />

kryptograficznych, musz uzyska poczenie z danym dostawc, aby uywa jego<br />

usug. Wykorzystuje si w tym celu funkcj CryptAquireContext, której zadaniem<br />

jest uzyskanie deskryptora kontekstu do CSP. Wiele funkcji <strong>CryptoAPI</strong> wykorzystuje<br />

taki deskryptor w wikszoci swoich wywoa, sposób uzyskania oraz definicja funkcji<br />

CryptAquireContext zostanie zatem przedstawiona poniej:<br />

BOOL WINAPI CryptAcquireContext(<br />

HCRYPTPROV* phProv,<br />

56 “Add security to your data with the <strong>CryptoAPI</strong>”, Code Magazine <strong>CryptoAPI</strong>, by Alex<br />

Feldstein, http://www.code-magazine.com/<br />

50


LPCTSTR pszContainer,<br />

LPCTSTR pszProvider,<br />

DWORD dwProvType,<br />

DWORD dwFlags<br />

); 57 Funkcja, w przypadku prawidowego wywoania, jako wynik zwraca<br />

wspomniany wczeniej deskryptor, który zawarty jest w zmiennej phProv. Zmienna<br />

psContainer pozwala na nazwanie kontenera z kluczami, które tworzy dostawca CSP<br />

- zmienna moe przyjmowa warto NULL, wtedy klucze utworzone zostan w<br />

domylnym kontenerze, którego uywa mog take inne aplikacje. Nazw dostawcy<br />

CSP, którego zamierzamy uy (rozdz. 3.2.1, tab. 3.3) opisuje zmienna pszProvider.<br />

O ile nazwa moe zosta pominita, o tyle typ dostawcy musi zosta zdefiniowany za<br />

pomoc parametru dwProvType. W przypadku pominicia nazwy dostawcy, zostanie<br />

wybrany domylny dostawca dla podanego typu.<br />

Podsumowujc - dziaanie funkcji to próba odnalezienia dostawcy CSP<br />

opisanego zmiennymi dwProvType i pszProvider. Gdy nawizane zostanie<br />

poczenie z danym dostawc, funkcja próbuje odnale kontener z kluczami<br />

uytkownika na podstawie parametru pszContainer. Ciekawym parametrem jest<br />

dwFlags, którego ustawienia umoliwiaj utworzenie CRYPT_NEWKEYSET bd<br />

zniszczenieCRYPT_DELETEKEYSET kontenera z kluczami.<br />

W celu zademonstrowania posu si trzema przykadowymi wywoaniami<br />

funkcjiCryptAcquireContext:<br />

1)<br />

CryptAcquireContext(<br />

&hCryptProv, // deskryptor do CSP<br />

UserName, // nazwa kontenera<br />

NULL, // uywamy domylnego dostawcy<br />

PROV_RSA_FULL, // typ dostawcy do uycia<br />

0) // wartoci flag<br />

2)<br />

CryptAcquireContext(<br />

&hCryptProv,<br />

UserName,<br />

NULL,<br />

PROV_RSA_FULL,<br />

CRYPT_NEWKEYSET)<br />

// deskryptor do CSP<br />

// nazwa kontenera<br />

// uywamy domylnego dostawcy<br />

// typ dostawcy do uycia<br />

// utworzenie nowego kontenera z kluczami<br />

57 http://msdn.microsoft.com/library/en-us/seccrypto/security/cryptacquirecontext.asp<br />

51


3)<br />

CryptAcquireContext(<br />

&hCryptProv,<br />

UserName,<br />

NULL,<br />

PROV_RSA_FULL,<br />

CRYPT_DELETEKEYSET)<br />

kluczami<br />

// deskryptor do CSP<br />

// nazwa kontenera<br />

// uywamy domylnego dostawcy<br />

// typ dostawcy do uycia<br />

// usunicie istniejcego kontenera z<br />

Pierwsze wywoanie nawizuje poczenie z domylnym dostawc CSP typu<br />

PROV_RSA_FULL (zgodnie z wczeniejszymi przykadami jest to Microsoft Strong<br />

Cryptographic Provider), po czym nastpuje próba poczenia si z istniejcym<br />

(wiadczy o tym parametr dwFLags ustawiony na warto 0) kontenerem na klucze<br />

uytkownika. W przypadku, gdy dany kontener nie istnia przed wywoaniem funkcji<br />

CryptAcquireContext, powinien zosta utworzony – zapewnia to parametr<br />

dwFlags ustawiony na warto CRYPT_NEWKEYSET. W momencie utworzenia nowego<br />

kontenera z kluczami, automatycznie tworzone s 2 pary kluczy: para podpisujca oraz<br />

para wymiany. Trzecie wywoanie suy do usunicia istniejcego kontenera z<br />

kluczami. Istnieje równie flaga o wartoci CRYPT_VERIFYCONTEXT, z której naley<br />

skorzysta w sytuacji, gdy nie bdziemy stosowali z tym kontekstem kluczy<br />

asymetrycznych, np. gdy nie bdzie potrzebny dostp do klucza publicznego.<br />

Uzyskanie deskryptora przez aplikacj, powizane jest z póniejszym<br />

zwolnieniem danego deskryptora, co uzyskuje si przez wywoanie funkcje<br />

CryptReleaseContext –jedynym parametrem, który naley ustawi jest wczeniej<br />

uzyskany deskryptor hProv.<br />

BOOL WINAPI CryptReleaseContext(<br />

HCRYPTPROV hProv,<br />

DWORD dwFlags<br />

); 58 Wywoanie funkcji CryptReleaseContext nie powoduje zniszczenia<br />

kontenera uytkownika lub par kluczy prywatnych/publicznych, zostaje tylko<br />

zakoczona sesja z okrelonym dostawc CSP a wszystkie klucze sesyjne bd obiekty<br />

hash, które nie zostay zniszczone odpowiednimi funkcjami, staj si bezuyteczne.<br />

58 http://msdn.microsoft.com/library/en-us/seccrypto/security/cryptreleasecontext.asp<br />

52


Program (wraz z kodem ródowym) odpowiedzialny za zaoenie kontenerów z<br />

kluczami uytkownika oraz sprawdzajcy poprawno poczenia z dostawc usug<br />

kryptograficznych znajduje si na zaczonej pycie CD pod nazw<br />

context_i_gen_key.exe.<br />

3.3.1.2 Lista dostawców usug kryptograficznych i ich cech<br />

Standardowo w systemach z rodziny Windows firma Microsoft dostarcza<br />

dostawców usug kryptograficznych, umoliwiajc jednoczenie uytkownikom<br />

wykorzystanie ich w swoich aplikacjach. List dostawców usug mona uzyska<br />

przegldajc rejestr systemowy (rozdz. 3.3.2), mona równie wykona list dostawców<br />

uywajc do tego interfejsu <strong>CryptoAPI</strong> - co jest znakomitym sposobem na zapoznanie<br />

si z okrelonymi funkcjami biblioteki. Dostpno dostawców jest uzaleniona od<br />

zainstalowanego systemu z rodziny Microsoft oraz wersji przegldarki internetowej<br />

Internet Explorer. Dodatkowo uzyska mona szczegóowe informacje na temat<br />

okrelonego dostawcy usug kryptograficznych, np. w celu zapoznania si z cechami<br />

wykorzystywanych przez niego algorytmów, w tym przypadku bdzie to dostawca o<br />

nazwie Microsoft Strong Cryptographic Provider.<br />

Funkcjami, które umoliwiaj pobranie aktualnej listy dostpnych w systemie<br />

dostawców usug kryptograficznych, s CryptEnumProviderTypes oraz<br />

CryptEnumProviders. W celu okrelenia szczegóowych informacji i parametrów<br />

danego dostawcy, naley posuy si funkcjami CryptGetDefaultProvider i<br />

CryptGetProvParam.<br />

3.3.1.2.1 CryptEnumProviderTypes<br />

Funkcja CryptEnumProvidersTypes pozwala na sporzdzenie wykazu<br />

typów CSP w systemie. Dokadna analiza definicji tej funkcji pozwala zapozna si z<br />

dostpnymi parametrami:<br />

BOOL WINAPI CryptEnumProviderTypes(<br />

DWORD dwIndex,<br />

DWORD* pdwReserved,<br />

DWORD dwFlags,<br />

DWORD* pdwProvType,<br />

LPTSTR pszTypeName,<br />

53


DWORD* pcbTypeName<br />

); 59 Parametr dwIndex to indeks do typu dostawcy, który zamierzamy podda<br />

sprawdzeniu. W przypadku, gdy chcemy pozna wszystkich dostawców dostpnych w<br />

danym systemie, naley ustawi ten parametr na warto 0 i zwiksza go w ptli o<br />

warto 1. W momencie, gdy ptla natrafi na warto odpowiadajc indeksowi<br />

dostawcy, parametr pdwProvType okreli nam nazw dostawcy. Parametry<br />

pdwReserved oraz dwFlags s zarezerwowane do uycia w przyszoci i powinny<br />

by ustawione odpowiednio na wartoNULL oraz zero.<br />

Przykadowy wynik dziaania programu (enum_prov_types.exe)<br />

wykorzystujcego funkcj CryptEnumProvidersTypes, na komputerze z<br />

zainstalowanym systemem Windows XP Professional w wersji polskiej bez Service<br />

Pack-ów, przedstawiono poniej na rys. 3.4:<br />

Rysunek 3.4 Wynik dziaania funkcji CryptEnumProvidersTypes<br />

ródo: Implementacja na podstawie Platform SDK: Cryptography, „Enumerating CSP Providers and<br />

Provider Types”, http://msdn.microsoft.com/library/enus/seccrypto/security/example_c_program_enumerating_csp_providers_and_provider_types.asp<br />

Wyniki wskazuj, e w standardowej instalacji systemu Windows XP PRO PL<br />

wraz z przegldark Internet Explorer w wersji 6.0.2600, istnieje 6 typów dostawców<br />

usug kryptograficznych, kady z nich dysponujcy innym zakresem funkcjonalnoci<br />

oraz rónymi moliwociami.<br />

59 http://msdn.microsoft.com/library/en-us/seccrypto/security/cryptenumprovidertypes.asp<br />

54


3.3.1.2.2 CryptEnumProviders<br />

Funkcja CryptEnumProviders umoliwia uzyskanie listy nazw dostpnych<br />

dostawców usug kryptograficznych. Definicja wraz z dostpnymi parametrami<br />

przypomina funkcjCryptEnumProvidersTypes i jest nastpujca:<br />

BOOL WINAPI CryptEnumProviders(<br />

DWORD dwIndex,<br />

DWORD* pdwReserved,<br />

DWORD dwFlags,<br />

DWORD* pdwProvType,<br />

LPTSTR pszProvName,<br />

DWORD* pcbProvName<br />

); 60<br />

Rysunek 3.5 Wynik dziaania funkcji CryptEnumProviders<br />

ródo: Implementacja na podstawie Platform SDK: Cryptography, „Enumerating CSP Providers and<br />

Provider<br />

Types”,http://msdn.microsoft.com/library/enus/seccrypto/security/example_c_program_enumerating_csp_providers_and_provider_types.asp<br />

Na podstawie wyników (rys. 3.5) programu enum_prov.exe mona stwierdzi,<br />

e system posiada 12 dostawców usug kryptograficznych, z czego 9 z nich jest<br />

dostarczanych przez firm Microsoft. Kady z dostawców naley do swojej grupy<br />

typów. Przykadowo Microsoft Base Cryptographic Provider v1.0 naley<br />

do typu RSA FULL (Signature and Key Exchange).<br />

3.3.1.2.3 CryptGetDefaultProvider<br />

Poszczególne typy dostawców posiadaj w swoim obrbie domylnego<br />

dostawc usug kryptograficznych, czyli takiego, który wybierany jest jako pierwszy<br />

podczas operacji kryptograficznych w momencie, gdy zdefiniujemy tylko typ dostawcy.<br />

60 http://msdn.microsoft.com/library/en-us/seccrypto/security/cryptenumproviders.asp<br />

55


Wyniki dziaania poprzedniego przykadu (rozdz. 3.3.2.2, rys. 3.5) pokazuj<br />

jednoznacznie, e w obrbie jednego typu dostawcy PROV_RSA_FULL (oznaczonego<br />

indeksem 1) znajduje si kilku (szeciu) dostawców usug kryptograficznych, np.<br />

Microsoft Base Cryptographic Provider v1.0, Microsoft Enhanced<br />

Cryptographic Provider v1.0, Microsoft Strong Cryptographic<br />

Provider. W tym przypadku, aby pozna domylnego (domylnego dla danego<br />

uytkownika bd dla komputera) dostawc dla typu PROV_RSA_FULL naley posuy<br />

si funkcjCryptGetDefaultProvider, której definicja przedstawiona jest poniej:<br />

BOOL WINAPI CryptGetDefaultProvider(<br />

DWORD dwProvType,<br />

DWORD* pdwReserved,<br />

DWORD dwFlags,<br />

LPTSTR pszProvName,<br />

DWORD* pcbProvName<br />

); 61 Funkcja odnajduje domylnego dostawc usug kryptograficznych dla typu<br />

zdefiniowanego przez parametr dwProvType, który moe przyj wartoci opisane w<br />

rozdz. 3.2.1 „Typy dostawców usug kryptograficznych” w tab. 3.2 (w tym przypadku<br />

PROV_RSA_FULL). Parametr dwFlags informuje funkcj o tym, czy chcemy pozna<br />

dostawc domylnego dla uytkownika (CRYPT_USER_DEFAULT) czy dla komputera<br />

(CRYPT_MACHINE_DEFAULT). Nazwa domylnego dostawcy jest zwracana w buforze<br />

pszProvName.<br />

3.3.1.2.4 CryptGetProvParam<br />

Ostatnim etapem pobierania listy dostpnych dostawców CSP jest uzyskanie<br />

szczegóowych informacji dotyczcych moliwoci danego dostawcy. Domylnym<br />

dostawc dla typu PROV_RSA_FULL jest dostawca o nazwie Microsoft Strong<br />

Cryptographic Provider, dla tego CSP przedstawi mona dokadne informacje<br />

o dugoci kluczy, moliwociach kryptograficznych, nazwach wykorzystywanych<br />

algorytmów. Przedstawienie tych danych umoliwia funkcja CryptGetProvParam.<br />

BOOL WINAPI CryptGetProvParam(<br />

HCRYPTPROV hProv,<br />

DWORD dwParam,<br />

61 http://msdn.microsoft.com/library/en-us/seccrypto/security/cryptgetdefaultprovider.asp<br />

56


BYTE* pbData,<br />

DWORD* pdwDataLen,<br />

DWORD dwFlags<br />

); 62 Pierwszy parametr okrela deskryptor do aktualnie wykorzystywanego CSP. W<br />

zalenoci od ustawie parametru dwParam, który suy do konkretyzowania zapyta o<br />

informacje na temat dostawcy, odpowied na te zapytania przekae parametr pbData.<br />

Parametrem dwParam moemy sprecyzowa wiele rodzajów zapyta, przykadem moe<br />

by uzyskanie nazwy dostawcy CSP przy pomocy zapytania PP_NAME.<br />

3.3.1.3 Uzyskanie informacji o dostawcach - implementacja<br />

Poniszy przykad programu enum_ex.exe ukazuje informacje jakie mona<br />

uzyska na temat jednego z dostawców usug kryptograficznych, który czy w sobie<br />

rónorodno moliwoci oraz odpowiednie bezpieczestwo, Microsoft Strong<br />

Cryptographic Provider, który jest domylnym dostawc (rozdz. 3.3.1.2.3) dla<br />

najbardziej powszechnego typu dostawców PROV_RSA_FULL, czcego w sobie<br />

moliwoci zarówno szyfrowania jak i cyfrowego podpisywania. Informacje uzyskane<br />

na temat kluczowych cech poszczególnych algorytmów mog by w póniejszym<br />

czasie wykorzystane przez uytkownika podczas dalszej nauki.<br />

Rysunek 3.6 Kluczowe cechy algorytmow dla dostawcy Strong Cryptographic Provider<br />

ródo: Implementacja wasna na podstawie Platform SDK: Cryptography,<br />

62 http://msdn.microsoft.com/library/en-us/seccrypto/security/cryptgetprovparam.asp<br />

57


Wyniki dziaania funkcji CryptGetProvParam (rys. 3.6) umoliwiaj<br />

zapoznanie si z dostpnymi algorytmami danego dostawcy CSP, w powyszym<br />

przypadku moemy skorzysta z piciu algorytmów szyfrujcych (Encrypt) o<br />

dugociach kluczy szyfrujcych od 56 do 168 bitów. Uzyskanie wartoci funkcji skrótu<br />

(Hash) umoliwia nam siedem kolejnych algorytmów, które precyzuj dugoci<br />

uzyskiwanych wartoci. Dwa ostatnie dostpne algorytmy to algorytm RSA sucy do<br />

podpisywania (Signature) oraz wymiany kluczy (Exchange).<br />

Implementacja powyszego programu (oparta na przykadzie Enumerating<br />

CSP Providers and Provider Types 63 ), przedstawiona zostaa poniej.<br />

Wykorzystanie biblioteki <strong>CryptoAPI</strong> w tym przykadzie umoliwia poznanie<br />

podstawowych parametrów poszczególnych algorytmów kryptograficznych.<br />

Najwaniejszym miejscem programu jest wywoanie funkcji CryptGetProvParam z<br />

odpowiedni opcj PP_ENUMALGS_EX - struktur, która wydobywa z okrelonego<br />

moduu CSP wszystkie dostpne algorytmy kryptograficzne wraz z podstawowymi<br />

cechami. Struktura PP_ENUMALGS_EX jest przedstawiona poniej:<br />

typedef struct _PROV_ENUMALGS_EX {<br />

ALG_ID aiAlgid; //identyfikator wspieranego algorytmu<br />

DWORD dwDefaultLen; //domylna dugo klucza<br />

DWORD dwMinLen; //minimalna dugo klucza<br />

DWORD dwMaxLen; //maksymalna dugo klucza<br />

DWORD dwProtocols; //liczba wspieranych protokoów<br />

DWORD dwNameLen; //dugo nazwy<br />

CHAR szName[20]; //nazwa skrócona<br />

DWORD dwLongNameLen; //dugo nazwy<br />

CHAR szLongName[40]; //nazwa pena<br />

} PROV_ENUMALGS_EX;<br />

Kod ródowy aplikacji przedstawia si nastpujco:<br />

//--------------------------------------------------------------------<br />

--<br />

// Pocztek: Uzyskanie podstawowych informacji o wspieranych<br />

algorytmach<br />

if(CryptGetProvParam(hProv, PP_ENUMALGS_EX, pbData, &cbData, dwFlags))<br />

{<br />

// Wydobycie informacji z pbData<br />

dwFlags=0;<br />

ptr = pbData;<br />

aiAlgid = *(ALG_ID *)ptr;<br />

63 http://msdn.microsoft.com/library/enus/seccrypto/security/example_c_program_enumerating_csp_providers_and_provider_types.asp<br />

58


ptr += sizeof(ALG_ID);<br />

dwDefaultLen = *(DWORD *)ptr;<br />

ptr += dwIncrement;<br />

dwMinLen = *(DWORD *)ptr;<br />

ptr += dwIncrement;<br />

dwMaxLen = *(DWORD *)ptr;<br />

ptr += dwIncrement;<br />

dwProtocols = *(DWORD *)ptr;<br />

ptr += dwIncrement;<br />

dwNameLen = *(DWORD *)ptr;<br />

ptr += dwIncrement;<br />

strncpy(szName,(char *) ptr, dwNameLen);<br />

// Ustalenie typu algorytmu<br />

switch(GET_ALG_CLASS(aiAlgid)) {<br />

case ALG_CLASS_DATA_ENCRYPT: pszAlgType = "Encrypt ";<br />

break;<br />

case ALG_CLASS_HASH: pszAlgType = "Hash ";<br />

break;<br />

case ALG_CLASS_KEY_EXCHANGE: pszAlgType = "Exchange ";<br />

break;<br />

case ALG_CLASS_SIGNATURE: pszAlgType = "Signature";<br />

break;<br />

default: pszAlgType = "Unknown ";<br />

}<br />

// Wydruk podstawowych informacji o algorytmach<br />

printf(" %8.8xh %-4d %-4d %-6d %s %-2d<br />

%s \n", aiAlgid, dwDefaultLen, dwMinLen, dwMaxLen, pszAlgType,<br />

dwNameLen, szName);<br />

}<br />

else<br />

fMore=FALSE;<br />

}<br />

// Koniec: Uzyskanie podstawowych informacji o wspieranych algorytmach<br />

//--------------------------------------------------------------------<br />

Wydruk 3.1 Uzyskiwanie informacji o cechach algorytmów<br />

Powysza implementacja jest rozwiniciem przykadu zaprezentowanego w<br />

rozdz. 3.3.2.4, rozwinicie stanowi wykorzystanie struktury PP_ENUMALGS_EX, która<br />

wydobywa znacznie wicej cech charakterystycznych dla danych algorytmów ni<br />

wspomniany wczeniej przykad. Uytkownik, oprócz uzyskania informacji o<br />

identyfikatorach algorytmów, ich podstawowym zastosowaniu oraz domylnej dugoci<br />

kluczy, ma szanse na zapoznanie si z zakresem dugoci kluczy - od dugoci<br />

minimalnej (mao bezpiecznej) do dugoci maksymalnej (bezpiecznej). Przedstawione<br />

w powyszym przykadzie informacje zapoznaj uytkownika z podstawowymi<br />

parametrami wykorzystywanych przez niego w przyszoci algorytmów, co pozwala na<br />

optymalny dobór metody kryptograficznej w zalenoci od potrzeb.<br />

59


3.3.2 Podstawy programowania z wykorzystaniem biblioteki <strong>CryptoAPI</strong><br />

3.3.2.1 Generowanie kluczy za pomoc funkcji <strong>CryptoAPI</strong><br />

Wykorzystywany przez nas interfejs API oferuje kilka metod pozyskiwania<br />

klucza, który w pakiecie <strong>CryptoAPI</strong> jest przechowywany w postaci specjalnego,<br />

niejawnego obiektu, do którego mamy dostp wycznie za porednictwem deskryptora.<br />

Kada z metod zwraca nowy obiekt klucza, który utrzymuje same dane klucza w<br />

ukryciu i wie je z wykorzystywanym symetrycznym algorytmem szyfrujcym oraz<br />

zbiorem flag kontrolujcych zachowanie tego klucza. 64 Najprostszym sposobem<br />

wygenerowania klucza jest utworzenie klucza cakowicie losowego (ang. random key).<br />

Przykadowe aplikacje generujce klucze symetryczne dla okrelonych algorytmów<br />

kryptograficznych zamieszczone s w rozdz. 4. Funkcj, która w <strong>CryptoAPI</strong> odpowiada<br />

za tworzenie losowych kluczy sesyjnych bd losowych par kluczy<br />

publicznych/prywatnych jest funkcja CryptGenKey.<br />

3.3.2.1.1 CryptGenKey<br />

BOOL WINAPI CryptGenKey(<br />

HCRYPTPROV hProv,<br />

ALG_ID Algid,<br />

DWORD dwFlags,<br />

HCRYPTKEY* phKey<br />

); 65 Deskryptor do okrelonego dostawcy usug kryptograficznych uzyskany podczas<br />

wywoania funkcji CryptAcquireContext zawarty jest w parametrze hProv. W<br />

zalenoci od ustawie parametru Algid (ustawienia take zalene s od CSP, z<br />

którego korzystamy), parametr phKey okreli deskryptor do klucza sesyjnego<br />

(symetrycznego) lub asymetrycznej pary kluczy. W przypadku generowania kluczy<br />

symetrycznych, tryb szyfrowania blokowego ustawiony jest domylnie na CBC (rozdz.<br />

2.2.2), z wektorem inicjalizujcym ustawionym na warto zero. Aby zmieni domylne<br />

parametry klucza naley posuy si funkcjCryptSetKeyParam.<br />

64 John Viega, Matt Messier, „C i C++. Bezpieczne programowanie. Receptury”, str. 272,<br />

Wydawnictwo Helion, Gliwice 2005<br />

65 http://msdn.microsoft.com/library/en-us/seccrypto/security/cryptgenkey.asp<br />

60


Moliwoci ustawie parametru Algid, zale od aktualnie wykorzystywanego<br />

dostawcy usug kryptograficznych - kady z dostawców oferuje wasne algorytmy<br />

kryptograficzne, kady posiada wic zupenie odrbne identyfikatory algorytmów.<br />

Poniej (tab. 3.5) przedstawi identyfikatory algorytmów przydatnych przy tworzeniu<br />

kluczy, które oferuje dostawca Microsoft Enhanced Cryptographic Provider:<br />

Parametr Algid<br />

CALG_RSA_SIGN<br />

CALG_RSA_KEYX<br />

CALG_RC2<br />

CALG_RC4<br />

CALG_DES<br />

CALG_3DES_112<br />

CALG_3DES<br />

<strong>Opis</strong><br />

RSA algorytm podpisujcy<br />

RSA algorytm wymiany kluczy<br />

RC2 algorytm szyfrowania<br />

blokowego<br />

RC4 algorytm szyfrowania<br />

strumieniowego<br />

DES algorytm szyfrowania<br />

Potrójny DES (ang. Triple DES) z<br />

dwoma kluczami<br />

Potrójny DES (Triple DES)<br />

Tabela 3.5 Algorytmy uzyskiwania klucza<br />

ródo: Opracowanie wasne na podstawie MSDN Library<br />

Dodatkowe wartoci parametru Algid (dla innych dostawców):<br />

Parametr Algid<br />

CALG_DH_SF<br />

CALG_DH_EPHEM<br />

AT_KEYEXCHANGE<br />

AT_SIGNATURE<br />

Tabela 3.6 Dodatkowe wartoci parametru Algid<br />

ródo: Opracowanie wasne na podstawie MSDN Library<br />

Klucze D-H<br />

Klucze D-H<br />

Klucze wymiany<br />

Cyfrowe podpisy<br />

<strong>Opis</strong><br />

Parametr dwFlags umoliwia ustalenie pewnych cech generowanego klucza,<br />

np. dugo klucza, któr kontrolujemy zmieniajc górne 16 bitów tego parametru. W<br />

przypadku, gdy odpowiada nam domylna dugo klucza, pozostawiamy górne 16<br />

bitów bez zmiany. Dolne 16 bitów parametru dwFlags odpowiada za ustawienie<br />

61


zdefiniowanych parametrów. Do najwaniejszych ustawie parametru dwFlags nale<br />

(ustawienia mog by czone w grupy ustawie za pomoc operatora „|”):<br />

CRYPT_ARCHIVABLE – umoliwia póniejsze (przed wywoaniem funkcji<br />

CryptDestroyKey) wyeksportowanie klucza;<br />

CRYPT_CREATE_SALT - umoliwia dodanie ziarna do tworzonego klucza,<br />

warto ziarna jest generowana losowo;<br />

CRYPT_NO_SALT - parametr zapewniajcy o braku ziarna w tworzonym<br />

kluczu;<br />

CRYPT_EXPORTABLE – umoliwia wyeksportowanie klucza (przy pomocy<br />

CryptExportKey) z moduu CSP do specjalnej struktury KeyBlob, zazwyczaj<br />

ustawienie jest stosowane w przypadku tworzenia kluczy sesyjnych (gdy<br />

parametr ten nie zostanie ustawiony, klucz sesyjny bdzie dostpny tylko i<br />

wycznie w obrbie jednej sesji).<br />

Funkcj, dziki której wyszukamy deskryptor do jednej z par kluczy<br />

publicznych/prywatnych znajdujcych si w kontenerze uytkownika jest<br />

CryptGetUserKey, której dokadn specyfikacj mona znale w dokumentacji<br />

<strong>CryptoAPI</strong> 66 .<br />

3.3.2.1.2 CryptDeriveKey<br />

Generowanie klucza opartego o losowe dane moe w pewnych sytuacjach nie<br />

satysfakcjonowa uytkownika, dlatego <strong>CryptoAPI</strong> umoliwia tworzenie kluczy przy<br />

wykorzystaniu informacji podawanych przez uytkownika, np. utworzenie klucza na<br />

podstawie hasa. Funkcj, która umoliwia tworzenie klucza sesyjnego opartego na<br />

danych wprowadzonych przez uytkownika jest CryptDeriveKey. Parametry tej<br />

funkcji s identyczne jak w przypadku CryptGenKey, z jedn rónic - dodatkowym<br />

parametrem hBaseData.<br />

BOOL WINAPI CryptDeriveKey(<br />

HCRYPTPROV hProv,<br />

ALG_ID Algid,<br />

HCRYPTHASH hBaseData,<br />

DWORD dwFlags,<br />

66 http://msdn.microsoft.com/library/en-us/seccrypto/security/cryptgetuserkey.asp<br />

62


HCRYPTKEY* phKey<br />

); 67 Parametr hBaseData zawiera deskryptor do obiektu Hash (rozdz. 3.3.6) do<br />

którego zostay dodane dane uytkownika, np. haso. Wane jest, e bezporednio po<br />

uyciu obiektu Hash do wyprowadzenia klucza, nie mona bdzie do niego doczy<br />

adnych dodatkowych danych i trzeba ten obiekt jak najszybciej zniszczy. Naley<br />

pamita, e funkcja CryptDeriveKey tworzy tylko i wycznie klucze sesyjne<br />

(symetryczne).<br />

Kada z wymienionych powyej dwóch metod (oraz metoda w rozdz. 3.3.6)<br />

zwraca nowy obiekt klucza, który utrzymuje same dane w ukryciu i wie je z<br />

wykorzystywanym symetrycznym algorytmem szyfrujcym oraz zbiorem flag<br />

kontrolujcych zachowanie tego klucza. 68<br />

3.3.2.1.3 CryptExportKey i CryptImportKey<br />

W pewnych sytuacjach zachodzi potrzeba zachowania klucza sesyjnego na okres<br />

duszy ni czas trwania jednej sesji lub wyeksportowania pary kluczy asymetrycznych,<br />

w bezpiecznej postaci. Pomocna okazuje si wtedy funkcja CryptExportKey, która<br />

pozwala na uzyskanie materiau klucza na podstawie deskryptora do klucza. Za pomoc<br />

powyszej funkcji, mona uzyska dane klucza bezporednio z jego obiektu - ale tylko<br />

wtedy gdy ten obiekt na to zezwala. Uzyskana warto nosi nazw KeyBlob, moe by<br />

przekazywana poprzez niezabezpieczone kanay informacyjne, a jedyn metoda na<br />

odzyskanie informacji sprzed eksportu jest uycie funkcji CryptImportKey. Naley<br />

pamita, e eksport klucza moliwy jest tylko wtedy, gdy podczas tworzenia go<br />

funkcj CryptGenKey bd CryptDeriveKey jednym z parametrów by<br />

CRYPT_EXPORTABLE. Definicja funkcji umoliwiajcej eksport klucza przedstawia si<br />

nastpujco:<br />

BOOL WINAPI CryptExportKey(<br />

HCRYPTKEY hKey,<br />

HCRYPTKEY hExpKey,<br />

DWORD dwBlobType,<br />

DWORD dwFlags,<br />

67 http://msdn.microsoft.com/library/en-us/seccrypto/security/cryptderivekey.asp<br />

68 John Viega, Matt Messier, „C i C++. Bezpieczne programowanie. Receptury”, str. 273,<br />

Wydawnictwo Helion, Gliwice 2005<br />

63


BYTE* pbData,<br />

DWORD* pdwDataLen<br />

); 69 Pierwszy parametr hKey to deskryptor do klucza, który zamierzamy<br />

wyeksportowa. Kolejny parametr to take deskryptor do klucza, tym razem do klucza,<br />

który uyty zostanie do zaszyfrowania informacji, któr mamy zamiar wyeksportowa.<br />

Parametr ten, moe przyj wartoNULL tylko wtedy, gdy zamierzamy wyeksportowa<br />

klucz publiczny - poniewa powinien on by jawny. W kadym innym przypadku<br />

parametr hExpKey powinien zawiera deskryptor do klucza szyfrujcego eksportowan<br />

informacj.<br />

Parametr dwBlobType specyfikuje form i typ eksportu w postaci struktury<br />

KeyBLOB. Istnieje 6 moliwych ustawie tego parametru, a najwaniejsze z nich to:<br />

PRIVATEKEYBLOB - uywany do transportu kluczy publicznych i prywatnych;<br />

PUBLICKEYBLOB - uywany do transportu kluczy publicznych;<br />

SIMPLEBLOB - uywany do transportu kluczy sesyjnych.<br />

Odzyskanie materiau wczeniej wyeksportowanego, przy pomocy funkcji<br />

CryptExportKey do formy KeyBLOB, moliwe jest tylko przy uyciu „bliniaczej”<br />

funkcji CryptImportKey, która przeksztaca form KeyBLOB do postaci klucza<br />

kryptograficznego i umieszcza go w kontenerze moduu CSP. Jednoczenie funkcja<br />

CryptImportKey staje si kolejnym sposobem na utworzenie klucza. Najczciej<br />

importowany s wanie dane uzyskane bezporednio z funkcji CryptExportKey,<br />

zatem od razu dysponujemy zaszyfrowanym kluczem w postaci struktury np.<br />

SIMPLEBLOB (w przypadku kluczy symetrycznych) - co znacznie upraszcza proces<br />

importu. Definicja funkcji sucej do importu jest przedstawiona poniej:<br />

BOOL WINAPI CryptImportKey(<br />

HCRYPTPROV hProv,<br />

BYTE* pbData,<br />

DWORD dwDataLen,<br />

HCRYPTKEY hPubKey,<br />

DWORD dwFlags,<br />

HCRYPTKEY* phKey<br />

); 70 69 http://msdn.microsoft.com/library/en-us/seccrypto/security/cryptexportkey.asp<br />

70 http://msdn.microsoft.com/library/en-us/seccrypto/security/cryptimportkey.asp<br />

64


Materia, który zamierzamy zaimportowa naley umieci w buforze, na który<br />

wskazuje parametr pbData. Parametr hPubKey to deskryptor do klucza, którym<br />

zamierzamy odszyfrowa importowany materia.<br />

3.3.2.1.4 CryptDestroyKey<br />

Deskryptor do wygenerowanego klucza powinien zosta zwolniony w<br />

momencie, gdy przestajemy korzysta z danego klucza. Funkcja zwalniajca deskryptor<br />

jako jedyny parametr przyjmuje deskryptor do wczeniej utworzonego klucza.<br />

BOOL WINAPI CryptDestroyKey(<br />

HCRYPTKEY hKey<br />

); 71 Po wywoaniu funkcji CryptDestroyKey deskryptor jest zwalniany i nie moe<br />

by uyty ponownie – naley pamita, e w przypadku kluczy sesyjnych wywoanie<br />

CryptDestroyKey powoduje utrat deskryptora do klucza sesyjnego, co skutkuje<br />

brakiem dostpu do klucza sesyjnego (wikszo dostawców nadpisuje miejsce w<br />

pamici gdzie przechowywany by sam klucz), jednak w przypadku kluczy<br />

asymetrycznych zwolniony deskryptor do pary kluczy publicznych/prywatnych nie<br />

powoduje usunicia kluczy z moduu CSP, kasowany jest jedynie sam deskryptor.<br />

3.3.2.2 Dostpne tryby szyfrowania i wektor inicjalizacji<br />

W praktyce tryb szyfrowania wykorzystywany jako domylny zaley zarówno<br />

od stosowanego moduu CSP, jak i od uywanego algorytmu szyfrujcego. W<br />

wikszoci przypadków jest to jednak tryb CBC. Moduy Base CSP, Enhanced CSP<br />

oraz Strong CSP firmy Microsoft zapewniaj obsug trybów CBC, CFB, ECB oraz<br />

OFB. 72 71 http://msdn.microsoft.com/library/en-us/seccrypto/security/cryptdestroykey.asp<br />

72 John Viega, Matt Messier, „C i C++. Bezpieczne programowanie. Receptury”, str. 274,<br />

Wydawnictwo Helion, Gliwice 2005<br />

65


3.3.2.2.1 CryptSetKeyParam<br />

Podczas tworzenia kluczy kryptograficznych, funkcje korzystaj z domylnych<br />

wartoci pewnych predefiniowanych ustawie, czego przykadem moe by funkcja<br />

CryptGenKey tworzca klucz sesyjny z wykorzystaniem trybu szyfrowania blokowego<br />

CBC. W pewnych przypadkach naley te domylne wartoci zmieni, na bardziej<br />

odpowiadajce uytkownikowi. Funkcj, która umoliwia zmian parametrów klucza (a<br />

co za tym idzie parametrów wykorzystywanego póniej algorytmu szyfrujcego) jest<br />

funkcjaCryptSetKeyParam, której definicja przedstawiona jest poniej:<br />

BOOL WINAPI CryptSetKeyParam(<br />

HCRYPTKEY hKey,<br />

DWORD dwParam,<br />

BYTE* pbData,<br />

DWORD dwFlags<br />

); 73<br />

Parametry zmieniane s na okres jednej sesji. Po rozpoczciu nowej sesji z<br />

dostawc, przyjmowane s znów domylne wartoci parametrów. Najwaniejsze<br />

ustawienia funkcji przekazywane s w parametrze dwParam (sucym do ustawiania<br />

parametrów klucza) i mog przyjmowa nastpujce wartoci, które w znacznym<br />

stopniu wpywaj na dobór algorytmu szyfrujcego:<br />

KP_IV – specyfikuje wektor inicjalizujcy w dla trybów szyfrowania blokowego<br />

(domylnie ustawiony na warto zero)<br />

KP_MODE – specyfikuje tryby szyfrowania blokowego (domylny tryb to CBC),<br />

które okrelone s za pomoc parametru pbData, moliwe ustawienia to:<br />

o CRYPT_MODE_CBC (rozdz. 2.2.2 i rozdz. 4.5.2)<br />

o CRYPT_MODE_CFB (rozdz. 2.2.2)<br />

o CRYPT_MODE_ECB (rozdz. 2.2.2 i rozdz. 4.5.1)<br />

o CRYPT_MODE_OFB (rozdz. 2.2.2)<br />

3.3.2.2.2 CryptGetKeyParam<br />

Informacje o utworzonym kluczu mog zosta wydobyte z klucza przy pomocy<br />

funkcjiCryptGetKeyParam.<br />

73 http://msdn.microsoft.com/library/en-us/seccrypto/security/cryptsetkeyparam.asp<br />

66


BOOL WINAPI CryptGetKeyParam(<br />

HCRYPTKEY hKey,<br />

DWORD dwParam,<br />

BYTE* pbData,<br />

DWORD* pdwDataLen,<br />

DWORD dwFlags<br />

); 74 W zalenoci od tego jak ustawiony jest parametr dwParam, którym okrelamy<br />

rodzaj informacji, które chcemy uzyska, odpowiedni wynik zawarty bdzie w<br />

parametrze pbData. Przedstawi kilka moliwych ustawie 75 parametru dwParam:<br />

KP_BLOCKLEN - umoliwia uzyskanie wielkoci bloku, gdy do uzyskanie klucza<br />

uyty zosta algorytm symetryczny blokowy;<br />

KP_IV - umoliwia uzyskanie wektora inicjalizujcego, w przypadku gdy do<br />

uzyskania klucza uyty zosta algorytm blokowy;<br />

KP_MODE - umoliwia poznanie trybu szyfrowania blokowego;<br />

KP_KEYLEN - umoliwia poznanie dugoci klucza;<br />

KP_SALT - umoliwia poznanie dugoci ziarna;<br />

KP_ALGID - przedstawienie identyfikatora algorytmu (rozdz. 3.3.3.1, tab.3.5)<br />

którym zosta utworzony klucz;<br />

KP_EFFECTIVE_KEYLEN - umoliwia poznanie efektywnej dugoci<br />

symetrycznego<br />

3.3.2.3 Szyfrowanie i deszyfrowanie danych<br />

Proces szyfrowania i deszyfrowania wraz z wykorzystywanymi do tego celu<br />

funkcjami zosta ju ukazany w momencie przedstawienia trybów szyfrowania<br />

blokowego, naley jednak zapozna si bliej z funkcjami uytymi w powyszych<br />

programach. Z poziomu biblioteki <strong>CryptoAPI</strong> szyfrowanie nie jest operacj<br />

skomplikowan, sam proces zamiany wiadomoci jawnej na kryptogram ogranicza si<br />

do odpowiedniego wywoania zaimplementowanych funkcji. Schematyczny proces<br />

szyfrowania a nastpnie deszyfrowania zostanie przedstawiony w niniejszym<br />

podrozdziale.<br />

74 Wszystkie moliwe ustawienia znajduj si na stronie http://msdn.microsoft.com/library/enus/seccrypto/security/cryptgetkeyparam.asp<br />

75 http://msdn.microsoft.com/library/en-us/seccrypto/security/cryptgetkeyparam.asp<br />

67


3.3.2.3.1 CryptEncrypt<br />

Szyfrowanie danych przy pomocy <strong>CryptoAPI</strong> sprowadza si do wywoania<br />

funkcji, która w bibliotece jest odpowiedzialna za ten proces. W przypadku <strong>CryptoAPI</strong><br />

funkcj t jest CryptEncrypt, jednak przed samym szyfrowaniem wiadomoci naley<br />

skorzysta z nastpujcego schematu:<br />

a) wygenerowanie klucza sesyjnego przy wykorzystaniu funkcji CryptGenKey<br />

(rozdz. 3.3.3), podczas tego wywoania utworzony zostaje losowy klucz sesyjny<br />

w oparciu o algorytm kryptografii symetrycznej, którego identyfikator<br />

przekazany jest jako jeden z argumentów funkcji;<br />

b) uycie funkcji CryptEncrypt w celu zaszyfrowania danych uytkownika przy<br />

wykorzystaniu klucza utworzonego w poprzednim kroku i uprzednio wybranego<br />

algorytmu;<br />

c) jeli jest to konieczne, naley wyeksportowa klucz sesyjny do postaci<br />

SIMPLEBLOB uywajc do tego celu funkcji CryptExportKey.<br />

Definicja funkcji CryptEncrypt jest nastpujca:<br />

BOOL WINAPI CryptEncrypt(<br />

HCRYPTKEY hKey,<br />

HCRYPTHASH hHash,<br />

BOOL Final,<br />

DWORD dwFlags,<br />

BYTE* pbData,<br />

DWORD* pdwDataLen,<br />

DWORD dwBufLen<br />

); 76 Parametr hKey przekazuje deskryptor do utworzonego klucza sesyjnego, dziki<br />

temu parametrowi przekazana zostaje równie informacja o algorytmie szyfrujcym.<br />

pbData okrela bufor, zawiera zestaw danych gotowych do zaszyfrowania.<br />

Zaszyfrowane dane nadpisuj dane tekstu jawnego w buforze.<br />

76 http://msdn.microsoft.com/library/en-us/seccrypto/security/cryptencrypt.asp<br />

68


3.3.2.3.2 CryptDecrypt<br />

Deszyfrowanie danych, uprzednio zaszyfrowanych przy uyciu funkcji<br />

CryptEncrypt, nastpuje dziki wywoaniu funkcji CryptDecrypt, której definicja<br />

o dostpne argumenty s bardzo podobne do funkcji CryptEncrypt.<br />

BOOL WINAPI CryptDecrypt(<br />

HCRYPTKEY hKey,<br />

HCRYPTHASH hHash,<br />

BOOL Final,<br />

DWORD dwFlags,<br />

BYTE* pbData,<br />

DWORD* pdwDataLen<br />

); 77<br />

3.3.2.4 Warto funkcji skrótu<br />

Uzyskanie deskryptora kontekstu do dostawcy usug kryptograficznych<br />

umoliwia przeprowadzanie kolejnych operacji opartych na kryptografii wykorzystujc<br />

gotowe funkcje <strong>CryptoAPI</strong>. Jedn z takich operacji jest uzyskiwanie wartoci funkcji<br />

skrótu, któr postaram si omówi w tym rozdziale.<br />

Funkcjami odpowiedzialnymi za tworzenie wartoci funkcji skrótu s<br />

CryptCreateHash oraz CryptHashData.<br />

3.3.2.4.1 CryptCreateHash<br />

Warto funkcji skrótu uzyskiwana jest w <strong>CryptoAPI</strong> przy pomocy specjalnego<br />

obiektu nazwanego Hash. Na pocztku naley utworzy pusty obiekt Hash, który<br />

nastpnie naley dalej przetwarza dodajc do niego dane (przy pomocy funkcji<br />

CryptHashData), dla których chcemy warto funkcji skrótu uzyska - mog to by<br />

dane przekazywanej wiadomoci bd kluczy sesyjnych. Takie przygotowania wartoci<br />

funkcji skrótu umoliwia dalsze operacje na obiekcie Hash (opisane w dalszej czci<br />

tego podrozdziau). Definicja funkcji umoliwiajcej utworzenie pustego obiektu Hash<br />

i uzyskanie do niego deskryptora jest nastpujca:<br />

BOOL WINAPI CryptCreateHash(<br />

HCRYPTPROV hProv,<br />

ALG_ID Algid,<br />

HCRYPTKEY hKey,<br />

77 http://msdn.microsoft.com/library/en-us/seccrypto/security/cryptdecrypt.asp<br />

69


DWORD dwFlags,<br />

HCRYPTHASH* phHash<br />

); 78 Utworzenie pustego obiektu Hash wymaga oczywicie poczenia z dostawc<br />

usug kryptograficznych (rozdz. 3.3.1.1) i uzyskanie deskryptora kontekstu.<br />

Przekazujemy ten deskryptor do funkcji CryptCreateHash przy pomocy parametru<br />

hProv. Parametr Algid 79 (najwaniejsze wartoci tego parametru znajduj si w tab.<br />

3.6) definiuje algorytm funkcji skrótu, którego chcemy uy w zalenoci, z jakiego<br />

dostawcy korzystamy. Parametr phHash bdzie zawiera deskryptor do wartoci<br />

obiektu Hash w przypadku pomylnego wywoania funkcji. Przykadem ukazujcym<br />

tworzenie wartoci skrótu przy pomocy trzech algorytmów jest program skrot.exe,<br />

który szczegóowo omówiony jest w rozdz. 6.4.<br />

Warto parametru Algid<br />

CALG_HMAC<br />

CALG_MAC<br />

CALG_MD2<br />

CALG_MD5<br />

CALG_SHA<br />

CALG_SHA1<br />

CALG_SSL3_SHAMD5<br />

Znaczenie<br />

Algorytm HMAC, (Keyed-<br />

Hash Message Authentication<br />

Code)<br />

Algorytm MAC<br />

(ang.Message Authentication<br />

Code)<br />

Algorytm f. skrótu MD2<br />

Algorytm f. skrótu MD5<br />

Algorytm f. skrótu SHA (ang.<br />

Secure Hash Algorithm)<br />

Algorytm f. skrótu SHA-1<br />

(ang. Secure Hash Algorithm)<br />

Uwierzytelnianie klienta<br />

SSL3<br />

Tabela 3.7 Algorytmy uzyskiwania wartoci funkcji skrótu<br />

ródo: Opracowanie wasne na podstawie MSDN Library<br />

78 http://msdn.microsoft.com/library/en-us/seccrypto/security/cryptcreatehash.asp<br />

79 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/seccrypto/security/alg_id.asp<br />

70


3.3.2.4.2 CryptHashData<br />

Wywoanie poprzedniej funkcji CryptCreateHash zwraca deskryptor do<br />

pustego obiektu Hash, do którego naley teraz doda dane. W tym celu uywa si<br />

funkcjiCryptHashData, której definicj prezentuj poniej:<br />

BOOL WINAPI CryptHashData(<br />

HCRYPTHASH hHash,<br />

BYTE* pbData,<br />

DWORD dwDataLen,<br />

DWORD dwFlags<br />

); 80 Parametr hHash to odpowiedni deskryptor do pustego obiektu Hash<br />

utworzonego wczeniej. Przy pomocy pbData przekazujemy do funkcji dane -<br />

dodawane do pustego obiektu Hash - dla których chcemy uzyska warto funkcji<br />

skrótu. Dugo dodawanych danych opisuje parametr dwDataLen.<br />

Utworzenie poprawnej wartoci funkcji skrótu pozwala na wykonanie<br />

nastpnych operacji, z których najwaniejszymi s:<br />

uzyskanie parametrów wartoci obiektu Hash przy pomocy funkcji<br />

CryptGetHashParam<br />

podpisanie wartoci funkcji skrótu przy uyciu funkcji CryptSignHash<br />

weryfikacja podpisu wartoci funkcji skrótu przy wykorzystaniu funkcji<br />

CryptVerifySignature<br />

3.3.2.4.3 CryptHashSessionKey<br />

Pusty obiekt Hash utworzony funkcj CryptCreateHash moemy take<br />

wykorzysta do obliczenia wartoci skrótu dla klucza sesyjnego, wygenerowanego przy<br />

pomocy funkcji CryptGenKey. Jeden obiekt Hash moe posuy do wytworzenia<br />

wikszej iloci wartoci funkcji skrótu wielu kluczy sesyjnych. Funkcja jako parametry<br />

przyjmuje deskryptor do obiektu Hash zawartego w parametrze hHash oraz klucz<br />

sesyjny zawarty w parametrze hKey.<br />

80 http://msdn.microsoft.com/library/en-us/seccrypto/security/crypthashdata.asp<br />

71


BOOL WINAPI CryptHashSessionKey(<br />

HCRYPTHASH hHash,<br />

HCRYPTKEY hKey,<br />

DWORD dwFlags<br />

); 81<br />

3.3.2.4.4 CryptGetHashParam<br />

Dwa poprzednie przykady pokazay jak uzyska (przy pomocy pustego obiektu<br />

Hash) warto funkcji skrótu w <strong>CryptoAPI</strong>. Czym jest warto funkcji skrótu<br />

dowiedzielimy si z rozdz. 2.4, ale do tej pory tak naprawd nie widzielimy jak ta<br />

uzyskana warto skrótu wyglda. Pomocna okazuje si funkcja<br />

CryptGetHashParam.<br />

BOOL WINAPI CryptGetHashParam(<br />

HCRYPTHASH hHash,<br />

DWORD dwParam,<br />

BYTE* pbData,<br />

DWORD* pdwDataLen,<br />

DWORD dwFlags<br />

); 82 Parametr hHash zawiera deskryptor do utworzonego wczeniej obiektu Hash<br />

zawierajcego odpowiednio dodane dane. Najwaniejszym parametrem funkcji<br />

CryptGetHashParam jest dwParam, jego ustawienia pozwalaj uzyska odpowiednie<br />

informacje dotyczce obiektu Hash, które zachowane zostan w zmiennej<br />

pbData. Parametr ten moe zosta ustawiony na trzy sposoby:<br />

HP_ALGID - uzyskamy informacje dotyczce algorytmu (identyfikator<br />

algorytmu) uytego do utworzenia obiektu Hash;<br />

<br />

<br />

HP_HASHSIZE - uzyskamy informacje dotyczce dugoci wytworzonej<br />

wartoci funkcji skrótu;<br />

HP_HASHVALUE - uzyskamy informacj o samej wartoci funkcji skrótu.<br />

3.3.2.4.5 CryptDestroyHash<br />

Podobnie, jak to miao miejsce w przypadku funkcji CryptAcquireContext i<br />

odpowiadajcej jej CryptReleaseContext, take dla funkcji CryptCreateHash<br />

81 http://msdn.microsoft.com/library/en-us/seccrypto/security/crypthashsessionkey.asp<br />

82 http://msdn.microsoft.com/library/en-us/seccrypto/security/cryptgethashparam.asp<br />

72


wywoywanej przy tworzeniu obiektów Hash i wartoci funkcji skrótu istnieje funkcja,<br />

która pozwala na zwolnienie deskryptorów i zniszczenie niepotrzebnych obiektów<br />

Hash. Gdy koczymy prac i korzystanie z obiektów Hash, naley uy funkcji<br />

CryptDestroyHash, której jedynym parametrem jest deskryptor do odpowiedniego<br />

obiektuHash, który zamierzamy zniszczy.<br />

BOOL WINAPI CryptDestroyHash(<br />

HCRYPTHASH hHash<br />

); 83 Ciekawostk jest to, e niektórzy dostawcy usug kryptograficznych podczas<br />

wywoania funkcji CryptDestroyHash i niszczeniu obiektu Hash, nadpisuj miejsce<br />

w pamici gdzie dany obiekt Hash by przechowywany. Ma to na celu zapewnienie, e<br />

obiektHash zosta cakowicie zniszczony i nie jest moliwe jego odzyskanie.<br />

3.3.2.5 Podpis cyfrowy i weryfikacja podpisu<br />

<strong>Opis</strong>ane powyej czynnoci prowadzce do utworzenia wartoci funkcji skrótu,<br />

nie odkrywaj dostatecznie zagadnienia zwizanego z funkcjami skrótu. Jak<br />

przedstawione zostao w rozdz. 2.4 uycie wartoci funkcji skrótu porednio umoliwia<br />

take skadanie cyfrowych podpisów i ich weryfikacji.<br />

3.3.2.5.1 CryptSignHash i CryptVerifySignature<br />

Funkcj, która pozwala wykona podpisanie skrótu wiadomoci jest<br />

CryptSignHash, o nastpujcej definicji:<br />

BOOL WINAPI CryptSignHash(<br />

HCRYPTHASH hHash,<br />

DWORD dwKeySpec,<br />

LPCTSTR sDescription,<br />

DWORD dwFlags,<br />

BYTE* pbSignature,<br />

DWORD* pdwSigLen<br />

); 84 Posiadajc par kluczy asymetrycznych, moemy uy klucza prywatnego do<br />

cyfrowego podpisania wiadomoci. Skrótowo wyjaniajc (dokadny opis w rozdz. 2.4)<br />

83 http://msdn.microsoft.com/library/en-us/seccrypto/security/cryptdestroyhash.asp<br />

84 http://msdn.microsoft.com/library/en-us/seccrypto/security/cryptSignHash.asp<br />

73

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!