CryptoAPI RSA: CryptDecrypt расшифровывает только в первый раз, другие вызовы возвращают NTE_BAD_DATA.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 CryptoAPI RSA: CryptDecrypt расшифровывает только в первый раз, другие вызовы возвращают NTE_BAD_DATA.

Сообщение Anonymous »

Я написал программу, которая шифрует/дешифрует буфер памяти произвольной длины. Шифрование заканчивается хорошо; но мой код дешифрования расшифровывает данные только один раз в любой позиции буфера, которая соответствует записям блока. Расшифровка остальных блоков завершается NTE_BAD_DATA.
Есть ли у вас какие-либо предположения, почему это происходит?
Вот мой код шифрования:
void CWinRSA::FinishEncrypt(const char* pcbRawData, const size_t nDataSize, char** ppcbEcrData, size_t& rnEcrSize) const
{
if (m_hProvider == NULL)
{
throw ("Cannot encrypt data with wrong provider!!");
}

if (m_hKey == NULL)
{
throw ("Cannot encrypt data with a wrong key!!");
}

size_t nBlockLength = GetBlockLength();
size_t nPaddingSize = nBlockLength - 11;

size_t nRemain = nDataSize % nBlockLength;
size_t nBlockProcess = (nDataSize / nPaddingSize + (nRemain != 0 ? 1 : 0));

size_t nResultSize = nBlockProcess * nBlockLength;

(*ppcbEcrData) = new char[nResultSize];

DWORD dwBufferLength = nBlockLength;
DWORD dwDataLength;

for (int iBlock = 0; iBlock < nBlockProcess - 1; iBlock++)
{
memcpy((*ppcbEcrData) + (iBlock * nBlockLength),
pcbRawData + (iBlock * nPaddingSize), nPaddingSize);

dwDataLength = nPaddingSize;

if (!CryptEncrypt(m_hKey, NULL, FALSE, 0,
(BYTE*)((*ppcbEcrData) + (iBlock * nBlockLength)),
&dwDataLength, dwBufferLength))
{
throw ("Cannot encrypt data!!");
}
}

memcpy((*ppcbEcrData) + ((nBlockProcess - 1) * nBlockLength),
pcbRawData + ((nBlockProcess - 1) * nPaddingSize), (nRemain ? nRemain : nPaddingSize));

dwDataLength = (nRemain ? nRemain : nPaddingSize);

if (!CryptEncrypt(m_hKey, NULL, TRUE, 0,
(BYTE*)((*ppcbEcrData) + ((nBlockProcess - 1) * nBlockLength)),
&dwDataLength, dwBufferLength))
{
throw ("Cannot encrypt data!!");
}

rnEcrSize = nResultSize;
}

расшифровка:
void CWinRSA::FinishDecrypt(const char* pcbRawData, const size_t nDataSize, char** ppcbDecData, size_t& rnDecSize) const
{
if (m_hProvider == NULL)
{
throw ("Cannot decrypt data with wrong provider!!");
}

if (m_hKey == NULL)
{
throw ("Cannot decrypt data with a wrong key!!");
}

size_t nBlockLength = GetBlockLength();

if ((nDataSize % nBlockLength) != 0)
{
throw ("Cannot decrypt data!! Probably data is corrupted!!");
}

size_t nPaddingSize = nBlockLength - 11;
size_t nBlockProcess = nDataSize / nBlockLength;

size_t nResultSize = nBlockProcess * nPaddingSize;

(*ppcbDecData) = new char[nResultSize];

DWORD dwDataLength;

char* pcbComputeResult = new char[nBlockLength];

for (int iBlock = 0; iBlock < nBlockProcess - 1; iBlock++)
{
memcpy(pcbComputeResult, pcbRawData + (iBlock * nBlockLength), nBlockLength);

if (!CryptDecrypt(m_hKey, NULL, FALSE, 0, (BYTE*)pcbComputeResult, &dwDataLength))
{
throw ("Cannot decrypt data!!");
}

memcpy((*ppcbDecData) + (iBlock * nPaddingSize), pcbComputeResult, nPaddingSize);
}

memcpy(pcbComputeResult, pcbRawData + ((nBlockProcess - 1) * nBlockLength), nBlockLength);

if (!CryptDecrypt(m_hKey, NULL, TRUE, 0, (BYTE*)pcbComputeResult, &dwDataLength))
{
DWORD dwError = GetLastError();

throw ("Cannot decrypt data!!");
}

memcpy((*ppcbDecData) + ((nBlockProcess - 1) * nPaddingSize), pcbComputeResult, nPaddingSize);

rnDecSize = ((nBlockProcess - 1) * nPaddingSize) + dwDataLength;

delete[] pcbComputeResult;
pcbComputeResult = NULL;
}


Подробнее здесь: https://stackoverflow.com/questions/329 ... lls-return
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»