Opis CryptoAPI.pdf
Opis CryptoAPI.pdf
Opis CryptoAPI.pdf
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