Крипто-Про CSP |
//-------------------------------------------------------------------- // Пример создания ключевого контейнера с именем, передаваемым в качестве // параметра командной строки. Если параметр не указан, то будет создан // контейнер с именем по умолчанию. В контейнере созданиются два ключа // (ключ обмена и ключ подписи). #define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING) void HandleError(char *s); int main(int argc, char *argv[]) { //-------------------------------------------------------------------- // Объявление и инициализация переменных. HCRYPTPROV hCryptProv; // Дескриптор контекста // критографического провайдера. HCRYPTKEY hKey; // Дескриптор открытого/закрытого ключа. CHAR szUserName[100]; // Буфер для хранения имени // ключевого контейнера. DWORD dwUserNameLen = 100; // Длина буфера. LPCSTR UserName= NULL; // Добавленное по выбору имя пользователя // здесь будет использовано как имя // ключевого контейнера (ограничение на 100 // символов). //-------------------------------------------------------------------- // Начало выполнения. Получение имени создаваемого контейнера. if(argv[1]!=NULL) { UserName = argv[1]; } // Для создания нового ключевого контейнера строка второго параметра // заменяется на NULL здесь и при следующем вызове функции // CryptAcquireContext. if(CryptAcquireContext( &hCryptProv, // Дескриптор CSP UserName, // Имя контейнера NULL, // Использование провайдера по умолчанию 75, // Тип провайдера 0)) // Значения флагов { printf("A crypto context with the %s key container \n", UserName); printf("has been acquired.\n\n"); } else { //-------------------------------------------------------------------- // Некоторая разновидность ошибок, возникающих при получении контекста. // Создание нового контейнера. if(CryptAcquireContext( &hCryptProv, UserName, NULL, 75, CRYPT_NEWKEYSET)) { printf("A new key container has been created.\n"); } else { HandleError("Could not create a new key container.\n"); } } // Конец else //-------------------------------------------------------------------- // Криптографический контекст с ключевым контейнером доступен. Получение // имени ключевого контейнера. if(CryptGetProvParam( hCryptProv, // Дескриптор CSP PP_CONTAINER, // Получение имени ключевого контейнера (BYTE *)szUserName, // Указатель на имя ключевого контейнера &dwUserNameLen, // Длина имени, ограниченная до 100 0)) { printf("A crypto context has been acquired and \n"); printf("The name on the key container is %s\n\n",szUserName); } else { // Ошибка получении имени ключевого контейнера HandleError("A context was acquired or created, but\ an error occurred getting the key container name.\n"); } //-------------------------------------------------------------------- // Контекст с ключевым контейнером доступен, // попытка получения дескриптора ключа обмена. if(CryptGetUserKey( hCryptProv, // Дескриптор CSP AT_SIGNATURE, // Спецификация ключа &hKey)) // Дескриптор ключа { printf("A signature key is available.\n"); } else { printf("No signature key is available.\n"); if(GetLastError() == NTE_NO_KEY) { //---------------------------------------------------------------- // Ошибка в том, что контейнер не содержит ключа. // Создание подписанной ключевой пары. printf("The signature key does not exist.\n"); printf("Create a signature key pair.\n"); if(CryptGenKey( hCryptProv, AT_SIGNATURE, 0, &hKey)) { printf("Created a signature key pair.\n"); } else { HandleError("Error occurred creating a signature key.\n"); } } else { HandleError("An error other than NTE_NO_KEY getting signature\ key.\n"); } } // Конец if printf("A signature key pair existed, or one was created.\n\n"); CryptDestroyKey(hKey); // Следующее, проверка ключа обмена. if(CryptGetUserKey( hCryptProv, AT_KEYEXCHANGE, &hKey)) { printf("An exchange key exists. \n"); } else { printf("No exchange key is available.\n"); // Проверка на то, нужно ли что-либо создавать. if(GetLastError()==NTE_NO_KEY) { // Создание ключевой пары обмена. printf("The exchange key does not exist.\n"); printf("Attempting to create an exchange key pair.\n"); if(CryptGenKey( hCryptProv, AT_KEYEXCHANGE, 0, &hKey)) { printf("Exchange key pair created.\n"); } else { HandleError("Error occurred attempting to create \ an exchange key.\n"); } } else { HandleError("An error other than NTE_NO_KEY occurred.\n"); } } printf("An exchange key pair existed, or one was created.\n\n"); CryptDestroyKey(hKey); CryptReleaseContext(hCryptProv,0); printf("Everything is okay. A signature key\n"); printf("pair and an exchange key exist in\n"); printf("the %s key container.\n",UserName); return 0; } // Конец main
Windows 2000/XP/2003: Необходимо Windows 2000 SP4 или
старше с Internet Explorer 6.0 или старше.
Windows NT/95/98/ME: CSP 3.0 не поддерживает (см. КриптоПро CSP
2.0 ).
Solaris: 9 Update 4 или выше.
FreeBSD: FreeBSD 5.2 или выше
Linux: RedHat 7.3, RedHad 9.0.
Ядро Windows NT: не поддерживает.
Что Вы
думаете по поводу данной статьи? |
Закажите CD c Крипто-Про CSP |