{
//-----------------------------------------------------------
// Достаем информацию из буфера '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 |


