CryptEncrypt не шифрует весь текст

Я пытаюсь зашифровать текстовое сообщение с помощью wincrypt. Мой код, однако, непредсказуем. Он не шифрует / дешифрует весь открытый текст, а только его часть. Если я изменяю длину пароля (например, на «password123»), он шифрует / дешифрует различное количество символов. Вот мой код

#include <windows.h>
#include <wincrypt.h>
#include <stdio.h>int main()
{
const char* passw = "password12";
const char* toencrypt = "consectetur adipiscing elit. In tellus nisl,   sodales non arcu quis, sagittis maximus orci cras amet.";

HCRYPTPROV hProv;
HCRYPTHASH hHash;
HCRYPTKEY hKey;
DWORD todwSize = (DWORD)strlen(toencrypt);
PBYTE pBuffer;

CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET);

CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);
CryptHashData(hHash, (BYTE*)passw, strlen(passw), 0);
CryptDeriveKey(hProv, CALG_RC4, hHash, 0, &hKey);

//--------------------------------------------------------------------

CryptEncrypt(hKey, 0, TRUE, 0, NULL, &todwSize, todwSize);

pBuffer = (BYTE *)malloc(todwSize);
strcpy((char*)pBuffer, toencrypt);

CryptEncrypt(hKey, 0, TRUE, 0, pBuffer, &todwSize, todwSize);
PBYTE pBreturn = pBuffer;
const char* message =  (const char*)pBreturn;
printf("%s", message);

//--------------------------------------------------------------------

DWORD dwSize = (DWORD)strlen(message);
PBYTE depBuffer;depBuffer = (BYTE *)malloc(1460);
strcpy((char*)depBuffer, message);CryptDecrypt(hKey, 0, TRUE, 0, depBuffer, &dwSize);CryptDestroyKey(hKey);
CryptDestroyHash(hHash);

CryptReleaseContext(hProv, 0);
if(GetLastError() != 0)
{
printf("%d", GetLastError());
}
PBYTE depBreturn = depBuffer;
printf("%s", (const char*)depBreturn);
printf("\n%d", strlen(message));
return 0;
}

Заранее спасибо за помощь!

1

Решение

думаю, что ваш код зашифрован нормально, но не удалось расшифровать все сообщение, потому что вы используете неверную длину в вызове CryptDecrypt

ваша главная ошибка DWORD dwSize = (DWORD)strlen(message); а также strcpy((char*)depBuffer, message); но сообщение является зашифрованным буфером, а не 0 завершает строку ANSI. так что вы не можете использовать strlen или же strcpy на зашифрованных данных — у вас есть длина зашифрованных данных, возвращаемых CryptEncrypt : todwSize — так ты и должен использовать с memcpy если вам нужно скопировать зашифрованный буфер и передать todwSize как есть CryptDecrypt

также как отметил Harry Johnston вы неверно используете простые данные / размер буфера в вызове CryptEncrypt,

должно быть CryptEncrypt(hKey, 0, TRUE, 0, NULL, &(needSize = todwSize), 0) при первом вызове (последний параметр CryptEncrypt dwBufLen должно быть 0, потому что вы используете НОЛЬ в качестве буфера, и нужно использовать другую переменную DWORD needSize для получения размера зашифрованного буфера, а не перезаписи размера обычного текстового буфера (todwSize) затем выделил needSize буфер, скопируйте в него todSize и позвонить CryptEncrypt(hKey, 0, TRUE, 0, pBuffer, &todwSize, needSize), но для RC4 размер зашифрованного и простого текста всегда равен. так needSize == todSize всегда в случае RC4

также вам нужно позвонить CryptAcquireContext только один раз с флагом CRYPT_VERIFYCONTEXT в твоем случае. и всегда нужно проверять результат функции. поэтому тестовый код может быть таким

int main()
{
const char* passw = "password12";
const char* toencrypt = "consectetur adipiscing elit. In tellus nisl,   sodales non arcu quis, sagittis maximus orci cras amet.";

HCRYPTPROV hProv;
HCRYPTHASH hHash;
HCRYPTKEY hKey;
DWORD todwSize = (DWORD)strlen(toencrypt), needSize;
PBYTE pBuffer;

if (CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
{
if (CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))
{
if (CryptHashData(hHash, (BYTE*)passw, (DWORD)strlen(passw), 0) &&
CryptDeriveKey(hProv, CALG_RC4, hHash, 0, &hKey))
{
if (CryptEncrypt(hKey, 0, TRUE, 0, NULL, &(needSize = todwSize), 0))
{
memcpy(pBuffer = (BYTE *)_alloca(needSize), toencrypt, todwSize);

if (CryptEncrypt(hKey, 0, TRUE, 0, pBuffer, &todwSize, needSize))
{
if (CryptDecrypt(hKey, 0, TRUE, 0, pBuffer, &todwSize))
{
if (memcmp(pBuffer, toencrypt, strlen(toencrypt)))
{
__debugbreak();
}
}
}
}
CryptDestroyKey(hKey);
}
CryptDestroyHash(hHash);
}
CryptReleaseContext(hProv, 0);
}

return 0;
}
6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]