Статус: Участник
Группы: Участники
Зарегистрирован: 09.03.2011(UTC) Сообщений: 28  Откуда: Екатеринбург Сказал «Спасибо»: 2 раз Поблагодарили: 1 раз в 1 постах
|
Устанавливаем КриптоПро CSP 3.6: версия ядра СКЗИ: 3.6.5364 КС1, версия продукта: 3.6.7491 Неважно на 32-х битную вннду или 64-х битную. Устанавливаем в хранилище MY текущего пользователя тестовый сертификат testcert, алгоритм подписи ГОСТ Р 34.11/34.10-2001. Я брал его с тестового УЦ компании КриптоПро. Запускаем такую программу Код:
#include "stdafx.h"
#include <windows.h>
#include <wincrypt.h>
#include <WincryptEx.h>
#include <stdio.h>
HCERTSTORE CertificateStore;
PCCERT_CONTEXT CertificateContext=NULL;
int _tmain(int argc, _TCHAR* argv[])
{
HCRYPTPROV CryptoProvider;
BOOL isGetCryptoProvider=FALSE;
DWORD TypeKey;
BOOL b;
CertificateStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, NULL, CERT_SYSTEM_STORE_CURRENT_USER, L"MY");
CertificateContext = CertFindCertificateInStore(CertificateStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR, L"testcert", NULL );
isGetCryptoProvider = CryptAcquireCertificatePrivateKey(CertificateContext, 0, NULL, &CryptoProvider, &TypeKey, &b);
if(!isGetCryptoProvider)
{
printf( "CryptAcquireCertificatePrivateKey\n" );
exit(1);
}
HCRYPTKEY SessionKey = NULL;
BOOL isCreateSessionKey = CryptGenKey(CryptoProvider, CALG_G28147, CRYPT_EXPORTABLE, &SessionKey);
if(!isCreateSessionKey)
{
printf( "CryptGenKey\n" );
exit(1);
}
BYTE *pbData;
DWORD dwDataLen;
BYTE data[1024];
for( int i=0; i < 50000; i++ )
{
memset( data, ' ', 1024 );
BOOL isGetIV = CryptGetKeyParam(SessionKey, KP_IV, NULL, &dwDataLen, 0);
if(!isGetIV)
{
printf( "CryptGetKeyParam - size\n" );
exit(1);
}
pbData = (BYTE*)malloc(dwDataLen);
isGetIV = CryptGetKeyParam(SessionKey, KP_IV, pbData, &dwDataLen, 0);
if(!isGetIV)
{
printf( "CryptGetKeyParam - data\n" );
exit(1);
}
BOOL isEncrypt = CryptEncrypt(SessionKey, 0, TRUE, 0, data, &dwDataLen, 1024);
if( !isEncrypt )
{
printf( "CryptEncrypt i=%d GetLastError()=%u\n", i, GetLastError() );
exit(1);
}
free( pbData );
}
CryptReleaseContext( CryptoProvider, 0 );
CertFreeCertificateContext( CertificateContext );
CertCloseStore(CertificateStore,CERT_CLOSE_STORE_FORCE_FLAG);
printf( "Success!\n" );
return 0;
}
Получаем вывод на консоль: CryptEncrypt i=4097 GetLastError()=2148073475 И почему так? Причём здесь NTE_BAD_KEY на 4097-й итерации? Устанавливаем КриптоПро CSP 3.6: версия ядра СКЗИ: 3.6.5364 КС1, версия продукта: 3.6.6796 Запускаем ту же программу. Получаем вывод на консоль: Success! С этим всё понятно, так и должно быть. Но в 3.6.7491...???
|