Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Нестандартные бмблмотеки, которые работают со строками быстрее. https://www.cyberforum.ru/ cpp-beginners/ thread476941.html
Podskagite, pls, kakie, gde mogno vsyat'/kupit'... Proga postoyanno vipolnyaet ogromnoe kol-vo operaziy so strokami (ishet posiziu, prisvaivaet, viresaet...). Nugno eto delo uskorit'. Moget eshe...
C++ CEdit::GetFont() возвращает NULL
Наверное, все знают сайт 'Первые шаги': 'MFC шаг за шагом'. Заглянем во второй шаг: http://www.firststeps.ru/mfc/steps/2.html Там просто создается динамическое (из указателя CEdit*) текстовое...
C++ Чтение из реестра
подскажите, пожалуйста, каким образом можно считать из реестра значения. Это смешно, но ВСЕ доступные мне примеры считывают одно значение. Я хочу считать из ключа uKey несколько значений...
C++ Как узнать, что в ком порт что-то записалось? Народ, подскажите как узнать что в ком порт что-то записалось, точнее пришло от подключенного оборудования. Пробовал постоянно опрашивать порт но иногда программа как-будто бы не замечает пришеддших... https://www.cyberforum.ru/ cpp-beginners/ thread476864.html
C++ Нужно чтоб в переменной типа CSrting data, находилась дата https://www.cyberforum.ru/ cpp-beginners/ thread476852.html
Мне нужно, что бы в переменной типа CSrting data, находилась дата ( день, месяц, год, час, мин, сек). Есть ли что нить в этом роде...
C++ Можно ли на CBuilder 6 откомпилировать exe для Linux?
I voobshe, vot napisal ya na CBuilder programmku, a kak sdelat' takuu ge dlya Linuxa? Isvinyaus' sa durazkiy vopros i saranie blagodaru sa podrobniy otvet.
C++ Что еще надо установить в HBLOB?
Почему может не работать такой код DWORD nSessions, nStations; SESSIONSTATS SessionStats; STATIONSTATS StationStats; HRESULT...
C++ Что такое CALLBACK функция...... Что такое CALLBACK функция...... https://www.cyberforum.ru/ cpp-beginners/ thread476707.html
C++ Помогите нарисовать круг в окне. https://www.cyberforum.ru/ cpp-beginners/ thread476706.html
Нада нарисовать круг в окне, но не могу понять почему, так получается: HWND hwnd; hwnd =FindWindow('SciCalc','Калькулятор'); HDC hdc; dc=GetWindowDC(hwnd); int i; cin >> i; CPen...
C++ Кто работал *.MDB через CDaoDatabase подскажите, все работает, но ... Люди выручайте, очень надо, по данной ссылке зайти не могу, проболема такая же. Кто нить дайте работающую ссылку или расскажите как ее решить. Очень надо. https://www.cyberforum.ru/ cpp-beginners/ thread476690.html
globus000
0

CryptoApi на WinXp и Win2000

22.06.2009, 17:26. Просмотров 1042. Ответов 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

Вернуться к обсуждению:
CryptoApi на WinXp и Win2000
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.06.2009, 17:26
Готовые ответы и решения:

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

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

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

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

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