わかりましたので、暗号化しているファイルが 5 つあります。IVを設定していません。
最初のファイルの復号化は問題ありません。
残りのファイルの最初のブロックは復号化されません。
したがって、ファイルは 99% 復号化されます。
IV を静的な値とランダムな値に設定しようとしましたが、同じ結果になりました。
最初に暗号化するファイルは、100% 復号化するために復号化する最初のファイルである必要はありません。
それが復号化と関係があると私に信じさせるのはどれですか?
そのため、暗号化のために aes キーをインポートしてキー ハンドルを作成します。
次に、ファイルを暗号化し、同じキーハンドルを使用して別のファイルに移動します...
すべてのファイルに新しいキーハンドルが必要ですか..?
キーハンドルをクリアする機能はありますか?
WCAPI が最後のファイルの最後のブロックを次のファイルの IV として使用していることを何かが教えてくれますか?
何か誤解しているかもしれませんが、ご容赦ください。
以下は、decrypt_file 関数です。
DWORD dwMode = CRYPT_MODE_CBC;
LPVOID aes_key = NULL;
LPVOID tmp_blk_buff = NULL;
DWORD bytes_read = NULL;
BOOL eof = FALSE;
DWORD tmp_blk_buff_size = TMP_BLOCK_BUFFER_SIZE(context->in_size);
tmp_blk_buff = VirtualAlloc(0, tmp_blk_buff_size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
Utils::zero_mem(tmp_blk_buff, tmp_blk_buff_size);
LPVOID iv_ = NULL;
iv_ = VirtualAlloc(0, AES_BLOCK_SIZE_, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
Utils::zero_mem(iv_, AES_BLOCK_SIZE_);
/*BYTE iv[AES_BLOCK_SIZE_] = {
0xAD, 0xAD, 0xAD, 0xAD,
0xAD, 0xAD, 0xAD, 0xAD,
0xAD, 0xAD, 0xAD, 0xAD,
0xAD, 0xAD, 0xAD, 0xAD
};
*/
// Utils::copy_mem(iv_, AES_BLOCK_SIZE_, iv, AES_BLOCK_SIZE_);
//CryptSetKeyParam(context->aes_hKey, KP_IV, (BYTE*)&iv_, 0);
CryptSetKeyParam(context->aes_hKey, KP_MODE, (BYTE*)&dwMode, 0);
// Encrypt data
do{
Utils::zero_mem(tmp_blk_buff, tmp_blk_buff_size);
bytes_read = NULL;
ReadFile(hFile_in, tmp_blk_buff, AES_BLOCK_SIZE_, &bytes_read, NULL);
if (bytes_read < AES_BLOCK_SIZE_)
{
eof = TRUE;
}
if (!CryptDecrypt(context->aes_hKey, NULL, eof, 0,(LPBYTE)tmp_blk_buff, &bytes_read))
{
context->last_error = GetLastError();
eof = TRUE;
}
WriteFile(hFile_out, tmp_blk_buff, bytes_read, &bytes_read, NULL);
} while (!eof);
// ===============
// Zero and Free Allocated memory.
Utils::zero_mem(tmp_blk_buff, tmp_blk_buff_size);
VirtualFree(tmp_blk_buff, tmp_blk_buff_size, MEM_RELEASE);
return (DWORD)1;