{

//-----------------------------------------------------------

// Достаем информацию из буфера 'pbData'.

dwFlags=0;

ptr = pbData;

aiAlgid = *(ALG_ID *)ptr;

ptr += sizeof(ALG_ID);

dwBits = *(DWORD *)ptr;

ptr += dwIncrement;

dwNameLen = *(DWORD *)ptr;

ptr += dwIncrement;

strncpy(szName,(char *) ptr, dwNameLen);

//--------------------------------------------------------

// Определяем тип алгоритма.

switch(GET_ALG_CLASS(aiAlgid)) {

case ALG_CLASS_DATA_ENCRYPT: pszAlgType = "Encrypt ";

break;

case ALG_CLASS_HASH: pszAlgType = "Hash ";

break;

case ALG_CLASS_KEY_EXCHANGE: pszAlgType = "Exchange ";

break;

case ALG_CLASS_SIGNATURE: pszAlgType = "Signature";

break;

default: pszAlgType = "Unknown ";

}

//------------------------------------------------------------

// Печатаем информацию об алгоритме.

printf(" %8.8xh %-4d %s %-2d %s\n",

aiAlgid, dwBits, pszAlgType, dwNameLen, szName

);

}

else

fMore=FALSE;

}

if(GetLastError() == ERROR_NO_MORE_ITEMS)

{

printf("\nThe program completed without error.\n");

}

else

{

HandleError("Error reading algorithm!");

}

}

Пример результата работы программы

Listing Available Provider Types.

Type Provider Type Name

____ ________________________________

1 RSA Full (Signature and Key Exchange)

3 DSS Signature

12 RSA SChannel

13 DSS Signature with Diffie-Hellman Key Exchange

18 Diffie-Hellman SChannel

Listing Available Providers.

НЕ нашли? Не то? Что вы ищете?

Type Provider Name

____ ________________________________

1 Gemplus GemSAFE Card CSP v1.0

1 Microsoft Base Cryptographic Provider v1.0

13 Microsoft Base DSS and Diffie-Hellman Cryptographic Provider

3 Microsoft Base DSS Cryptographic Provider

18 Microsoft DH SChannel Cryptographic Provider

1 Microsoft Enhanced Cryptographic Provider v1.0

13 Microsoft Enhanced DSS and Diffie-Hellman Cryptographic Provider

12 Microsoft RSA SChannel Cryptographic Provider

1 Microsoft Strong Cryptographic Provider

1 Schlumberger Cryptographic Service Provider

The default provider name is Microsoft Strong Cryptographic Provider

Enumerating the supported algorithms

Algid Bits Type Name Algorithm

Length Name

________________________________________________________

00006602h 40 Encrypt 4 RC2

00006801h 40 Encrypt 4 RC4

00006601h 56 Encrypt 4 DES

00006609h 112 Encrypt 13 3DES TWO KEY

00006603h 168 Encrypt 5 3DES

00008004h 160 Hash 6 SHA-1

00008001h 128 Hash 4 MD2

00008002h 128 Hash 4 MD4

00008003h 128 Hash 4 MD5

00008008h 288 Hash 12 SSL3 SHAMD5

00008005h 64 Hash 4 MAC

00002400h 512 Signature 9 RSA_SIGN

0000a400h 512 Exchange 9 RSA_KEYX

00008009h 0 Hash 5 HMAC

The program completed without error.

Задание к лабораторной работе

Заполнить указанные пропуски в программе вывода списка криптопровайдеров с параметрами реализуемых в них алгоритмов.

#include "stdafx. h"

#define _WIN32_WINNT 0x0500

#define WINVER 0x0500

#include <windows. h>

#include <stdio. h>

/* 1. Вставить заголовочный файл для работы с Microsoft CryptoAPI */

// Определение массива имен типов криптопровайдеров

LPTSTR szProvType[]={

NULL,

"RSA Full (Signature and Key Exchange)",

"RSA Signature",

"DSS Signature",

"PROV_FORTEZZA",

"PROV_MS_EXCHANGE",

"PROV_SSL",

NULL, NULL, NULL, NULL, NULL,

"RSA SChannel",

"DSS Signature with Diffie-Hellman Key Exchange",

"PROV_EC_ECDSA_SIG",

"PROV_EC_ECNRA_SIG",

"PROV_EC_ECDSA_FULL",

"PROV_EC_ECNRA_FULL",

"Diffie-Hellman SChannel",

NULL,

"PROV_SPYRUS_LYNKS",

"PROV_RNG",

"PROV_INTEL_SEC"};

// Определение массива имен типов исполнения криптопровайдеров

LPTSTR szImpType[]={

NULL,

"Hardware",

"Software",

"Mixed",

"Unknown",

"Not define", "Not define", "Not define",

"Removable",

"Type 9", "Type 10", "Type 11"};

// Определение массива имен классов алгоритмов

LPTSTR szAlgClass[]={

NULL,

"Signature",

"Encrypt ",

"Encrypt ",

"Hash ",

"Exchange ",

"All "};

// Определение и инициализация переменных

HMODULE hDll=0;

DWORD dwCount, cbName;

DWORD dwDataLen, dwIndex=0;

WCHAR swzProvName[100];

CHAR szName[100];

PROV_ENUMALGS AlgInfo;

PROV_ENUMALGS_EX AlgInfoEx;

CHAR *pszAlgType = NULL;

LPWSTR pswzProvName=NULL;

LPWSTR pszProvName=NULL;

DWORD dwProvType, dwCryptError, dwVersion, dwImpType;

DWORD dwFlags=0;

HCRYPTPROV hProv = 0;

DWORD dwSigKeySizeInc, dwXchKeySizeInc;

void main(void) {

// Цикл перечисления криптопровайдеров.

while (/* 2. Имя функции? */(dwIndex, NULL,0, &dwProvType, NULL, &cbName)){

if (/* 3. Имя функции? */(dwIndex++,NULL,0,&dwProvType, szName, &cbName)){

// Открываем контекст криптопровайдера

if (!

/* 4. Открыть контекст криптопровайдера не подключаясь к контейнерам ключей. Дескриптор – hProv, имя и тип криптопровайдера получаем из вызова предыдущей

функции перечисления криптопровайдеров */

) {

printf("Error:CryptAcquireContext=0x%X.\n",GetLastError());

break;

}

// Получаем версию криптопровайдера

dwDataLen = sizeof(DWORD);

if (!CryptGetProvParam(

hProv,

PP_VERSION,

(PBYTE)&dwVersion,

&dwDataLen,

0)) {

printf("Error:CryptGetProvParam=0x%X.\n",GetLastError());

goto ReleaseResource;

}

// Получаем тип исполнения криптопровайдера

dwDataLen = sizeof(DWORD);

if (!

/* 5. В переменную dwImpType получить вид реализации криптопровайдера с

дескриптором hProv (аппаратный, программный или аппаратно-программный) */

) {

printf("Error:CryptGetProvParam=0x%X.\n",GetLastError());

goto ReleaseResource;

}

// Распечатываем полученную информацию

printf("\n\n\nProvider name: %s\n", szName);

printf("Provider version: %d.%d\n", HIBYTE(LOWORD(dwVersion)), LOBYTE(LOWORD(dwVersion)));

printf("Provider type: %s\n", szProvType[dwProvType]);

printf("Provider implementation type: %s\n", szImpType[dwImpType]);

// Распечатываем заголовок таблицы алгоритмов

printf("\n |Length info (bits)|\n");

printf("AlgId|Type |Def |Max |Min |Name \n");

printf("-----+---------+-----+------+-----+----------------\n");

// Перечисляем алгоритмы криптопровайдера

for (dwCount=0 ; ; dwCount++) {

// Устанавливаем флаг CRYPT_FIRST

// при первом обращении в цикле.

if (dwCount == 0) dwFlags = CRYPT_FIRST;

else dwFlags = 0;

// Получаем информацию об алгоритмах

dwDataLen = sizeof(PROV_ENUMALGS_EX);

dwCryptError=ERROR_SUCCESS;

// Запрашиваем расширенную информацию об алгоритмах

if (!

/* 6. В переменную AlgInfoEx получить расширенную информацию об алгоритмах

криптопровайдера с дескриптором hProv. В переменную dwDataLen получить длину

AlgInfoEx. Необходимые значения флагов уже записаны в переменную dwFlags */

) {

dwCryptError=GetLastError();

if (dwCryptError == ERROR_NO_MORE_ITEMS) break;

if (dwCryptError == NTE_BAD_FLAGS || dwCryptError== NTE_BAD_TYPE) {

dwDataLen = sizeof(PROV_ENUMALGS);

// Если криптопровайдер не поддерживает расширенный запрос, то

// запрашиваем сокращенную информацию об алгоритмах

if (!

/* 7. В переменную AlgInfo получить сокращенную информацию об алгоритмах

криптопровайдера с дескриптором hProv. В переменную dwDataLen получить длину

AlgInfo. Необходимые значения флагов уже записаны в переменную dwFlags */

) {

/* 8. Проанализировать код возникшей ошибки. Если возникла ошибка,

показывающая конец списка алгоритмов, то прервать цикл */

printf("Error %x reading algorithm!\n",GetLastError());

goto ReleaseResource;

}

AlgInfoEx. aiAlgid=AlgInfo. aiAlgid;

AlgInfoEx. dwDefaultLen=AlgInfo. dwBitLen;

AlgInfoEx. dwMaxLen=0;

AlgInfoEx. dwMinLen=0;

lstrcpy(AlgInfoEx. szLongName, AlgInfo. szName);

}

else {

printf("Error %x reading algorithm!\n",GetLastError());

goto ReleaseResource;

}

}

// Распечатываем полученную информацию

printf(

"%4.4xh|%s|%-4d |%-5d |%-4d |%s \n",

AlgInfoEx. aiAlgid,

szAlgClass[GET_ALG_CLASS(AlgInfoEx. aiAlgid) >> 13],

AlgInfoEx. dwDefaultLen,

AlgInfoEx. dwMaxLen,

AlgInfoEx. dwMinLen,

AlgInfoEx. szLongName);

}

// Окончание работы с криптопровайдером

/* 9. Освободить дескриптор криптопровайдера hProv */

hProv=0;

}

}

// Аварийное завершение работы с криптопровайдером

ReleaseResource:

if (hProv)/* 10. Освободить дескриптор криптопровайдера hProv */ ;

return;

}

Пример результата работы программы

Provider name: Gemplus GemSAFE Card CSP v1.0

Provider version: 0.0

Provider type: RSA Full (Signature and Key Exchange)

Provider implementation type: Type 11

|Length info (bits)|

AlgId|Type |Def |Max |Min |Name

-----+---------+-----+------+-----+----------------

6602h|Encrypt |40 |128 |40 |RSA Data Security's RC2

6801h|Encrypt |40 |128 |40 |RSA Data Security's RC4

6601h|Encrypt |56 |56 |56 |Data Encryption Standard (DES)

6609h|Encrypt |112 |112 |112 |Two Key Triple DES

6603h|Encrypt |168 |168 |168 |Three Key Triple DES

8004h|Hash |160 |160 |160 |Secure Hash Algorithm (SHA-1)

8001h|Hash |128 |128 |128 |Message Digest 2 (MD2)

8002h|Hash |128 |128 |128 |Message Digest 4 (MD4)

8003h|Hash |128 |128 |128 |Message Digest 5 (MD5)

8008h|Hash |288 |288 |288 |SSL3 SHAMD5

8005h|Hash |0 |0 |0 |Message Authentication Code

2400h|Signature|1024 |1024 |512 |RSA Signature

a400h|Exchange |512 |512 |512 |RSA Key Exchange

8009h|Hash |0 |0 |0 |Hugo's MAC (HMAC)

Provider name: Microsoft Base Cryptographic Provider v1.0

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4