С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

CryptoApi на WinXp и Win2000 - C++

22.06.2009, 17:26. Просмотров 935. Ответов 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
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.06.2009, 17:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос CryptoApi на WinXp и Win2000 (C++):

cryptoapi, SHA-1 - C++
char *str = new char; //данные HCRYPTPROV hCryptProv = 0; HCRYPTHASH hHash = 0; gets(str); DWORD count=strlen(str); ...

cryptoapi, шифрование, 3DES - C++
BYTE* Encrypt(char *str, char *password) { HCRYPTPROV hCryptProv = 0; HCRYPTKEY hKey = 0; HCRYPTHASH hHash = 0; ...

Хеширование MD5 CryptoAPI - C++
Решал задачу на хеширование текста алгоритмом MD5 Дошел до такого: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;windows.h&gt; ...

Литература по получению MD5 файла в C++ с CryptoApi - C++
Помогите пожалуйста, требуется написать программу, которая выводит на экран хеш файла через CryptiApi. На сайте MSDN есть статейка: Example...

CryptoAPI "хеш не может быть использовано в указанном состоянии" - C++
Здравствуйте. Возникает вышеуказанная ошибка (номер 8009000C) при вызове CryptEncrypt. Хотелось бы разобраться, в чём проблема. Мне нужно...

WinXp Создание процесса - C++
Всем привет! Подскажите написана программа использующая опенгл, глу32, и sfml вдобавок при тестировании на разных осях на 7ке 32х на...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2009, 17:26
Привет! Вот еще темы с ответами:

Заблокировать процесс на WinXp/7/8 - C++
Привет всем. Кто может накидать инфы по тому как можно заблокировать процесс на винде, к примеру Firefox ili Ie. Тоесть чтобы ехе не...

Не стартует программа на WinXP SP3 - C++
Здравствуйте. Есть программа, которая работает на всех Windows, но на WinXP SP3, .NET последний, при запуске вылетает с ошибкой: Exception...

Возможно ли законное обновление Win2000 до WinXP? - Windows XP
Есть ноут с лицензионной наклейкой Windows2000 PRO. Нужно поставить туда XPюшу, тоже PRO. Так вот вопрос: останется ли в силе лицензия,...

проблема совместимости EXE в winXP, win2000, win98 - Visual Basic
Скомпилирований файл в WinXP-2000 не идёт на win98 как мне обяснили из за обратной совместимостит, но получилось так что я его...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

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