Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
globus000
Сообщений: n/a
#1

CryptoApi на WinXp и Win2000 - C++

22.06.2009, 17:26. Просмотров 922. Ответов 0
Метки нет (Все метки)

Есть странная проблемма следующего содержания
Есть простенький класс для шифрования/дешифрования по RSA с применением Cryptoapi. Когда я запускаю свою програмулину под WinXp все работает и шифрует нормально, когда запускаю под Win2000 выпадает сообщение 'Плохой ключ'. При этом все ключи инициализуруются правильно и при их инициализации ошибок нет
Помогите, как решить эту проблему

код класса:

[code]
CZCrypt::CZCrypt()
{
m_hRSACryptProv = NULL;
m_hRSAKey = NULL;
m_hDESKey = NULL;
}

CZCrypt::~CZCrypt()
{
ReleaseRSA();
}

DWORD CZCrypt::InitRSA(char *UserName)
{
DWORD err = 0;

if(!CryptAcquireContext(&m_hRSACryptProv, UserName, MS_DEF_PROV, PROV_RSA_FULL, 0))
{
err = GetLastError();
if(err != 0x80090016)
return err;
if(!CryptAcquireContext(&m_hRSACryptProv, UserName, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET))
return GetLastError();
}
return 0;
}

DWORD CZCrypt::GenDESKey()
{
if(m_hRSACryptProv == NULL)
return 1;

if(m_hDESKey)
CryptDestroyKey(m_hDESKey);
m_hDESKey = NULL;

if(!CryptGenKey(m_hRSACryptProv, CALG_DES, CRYPT_EXPORTABLE, &m_hDESKey)) //64 bit
return GetLastError();
return 0;
}

void CZCrypt::ReleaseRSA()
{
if(m_hRSACryptProv)
CryptReleaseContext(m_hRSACryptProv, 0);
m_hRSACryptProv = NULL;
if(m_hRSAKey)
CryptDestroyKey(m_hRSAKey);
m_hRSAKey = NULL;
if(m_hDESKey)
CryptDestroyKey(m_hDESKey);
m_hDESKey = NULL;
}

DWORD CZCrypt::GenRSAKeys()
{
if(m_hRSACryptProv == NULL)
return 1;

if(m_hRSAKey)
CryptDestroyKey(m_hRSAKey);
m_hRSAKey = NULL;

if(!CryptGenKey(m_hRSACryptProv, AT_KEYEXCHANGE, CRYPT_EXPORTABLE|0x04000000, &m_hRSAKey)) //1024 bit
return GetLastError();
return 0;
}

DWORD CZCrypt::GetRSAPublicKey(RSAPublicKey1024* pkey)
{
if(m_hRSACryptProv==NULL || m_hRSAKey==NULL)
return 1;

DWORD actual_data_length = sizeof(RSAPublicKey1024);
if(!CryptExportKey(m_hRSAKey, NULL, PUBLICKEYBLOB, 0, (BYTE*)pkey, &actual_data_length))
return GetLastError();
return 0;
}

DWORD CZCrypt::GetDESKey(DESKEY* dkey)
{
if(m_hRSACryptProv==NULL || m_hDESKey==NULL)
return 1;

DWORD actual_data_length = sizeof(DESKEY);
if(!CryptExportKey(m_hDESKey, NULL, PLAINTEXTKEYBLOB, 0, (BYTE*)dkey, &actual_data_length))
return GetLastError();
return 0;
}

DWORD CZCrypt::EncryptRSA(BYTE* plainbuf, int plainbufsize, DWORD* actual_data_length)
{
if(m_hRSACryptProv==NULL || m_hRSAKey==NULL)
return 1;

if(plainbufsize < 1024/8)
return 1;

if(!CryptEncrypt(m_hRSAKey, NULL, TRUE, 0, (BYTE*)plainbuf, actual_data_length, plainbufsize))
return GetLastError();
return 0;
}

DWORD CZCrypt:ecryptRSA(BYTE* cipherbuf, DWORD* actual_data_length)
{
if(m_hRSACryptProv==NULL || m_hRSAKey==NULL)
return 1;

if(!CryptDecrypt(m_hRSAKey, NULL, TRUE, 0, (BYTE*)cipherbuf, actual_data_length))
return GetLastError();
return 0;
}

DWORD CZCrypt::ImportRSAKey(BYTE* plainRSAkey, DWORD dwExp)
{
if(m_hRSACryptProv==NULL)
return 1;

if(m_hRSAKey != NULL)
{
if(!CryptDestroyKey(m_hRSAKey))
return 1;
m_hRSAKey = NULL;
}

RSAPublicKey1024 rkey;
CopyMemory(rkey.modulus, plainRSAkey, 1024/8);
rkey.publickeystruc.aiKeyAlg = ALG_TYPE_RSA|ALG_CLASS_KEY_EXCHANGE;
rkey.publickeystruc.bType = PUBLICKEYBLOB;
rkey.publickeystruc.bVersion = CUR_BLOB_VERSION;
rkey.publickeystruc.reserved = 0;
rkey.rsapubkey.bitlen = 1024;
rkey.rsapubkey.magic = 0x31415352; //RSA1
rkey.rsapubk
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.06.2009, 17:26     CryptoApi на WinXp и Win2000
Посмотрите здесь:
cryptoapi, SHA-1 C++
cryptoapi, шифрование, 3DES C++
Хеширование MD5 CryptoAPI C++
Литература по получению MD5 файла в C++ с CryptoApi C++
C++ CryptoAPI "хеш не может быть использовано в указанном состоянии"
C++ WinXp Создание процесса
Заблокировать процесс на WinXp/7/8 C++
Не стартует программа на WinXP SP3 C++
Компиляция dll на win8x64 и ошибка на winXP C++
C++ Как сделать черно белый скрин в WinXP
C++ VS2015, программы не запускаются на WinXP, хотя компилированы для него
Возможно ли законное обновление Win2000 до WinXP? Windows XP

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru