Здравствуйте, так что у меня возникла очень странная проблема при попытке расшифровать текст AES, который был зашифрован с помощью AES с использованием phpseclib.
Я шифрую RSA ключ AES, который я использую для шифрования сообщения на сервер.
Сервер расшифровывает зашифрованный RSA ключ AES и использует его для расшифровки входящего сообщения.
также зашифровать ответ.
Я проверяю, что ключ такой же, экспортируя ключ AES как PLAINTEXTKEYBLOB.
Проблема возникает, когда я иду расшифровывать зашифрованный текст AES с сервера с помощью WCAPI, используя HKey HANDLE, сгенерированный для шифрования исходного сообщения.
CryptDecrypt () только оставляет меня с мусором. Расшифровка не производит оригинальное сообщение.
Я также проверил, что на самом деле я дешифрую зашифрованное сообщение, а не какой-то случайный буфер.
Также, прежде чем пытаться расшифровать это сообщение, я отправляю зашифрованное сообщение, содержащее мой открытый ключ, чтобы сервер мог зашифровать следующий ключ AES.
Это успешно.
Я могу зашифровать / расшифровать из C ++ в PHP, но не наоборот.
Вот PHP.
$aes_ = new Crypt_AES(); //CRYPT_AES_MODE_CBC is default
$aes_->setPassword($aes_key);$aes_->setIV("1234567890123456");
// Encrypt MSG with AES key
$encrypted_msg = $aes_->encrypt($data);
$encrypted_msg;
return base64_encode($encrypted_msg);
Вот С ++
LPBYTE enc_bytes = (LPBYTE)context->in_buff;
DWORD pl_s = context->in_size;
LPVOID tmp_blk_buff = NULL;
LPVOID plain_text = NULL;
LPBYTE new_bytes = NULL;
DWORD p_block_size = NULL;
BOOL eof = FALSE;
DWORD tbbs = TMP_BLOCK_BUFFER_SIZE(context->in_size);
DWORD dwMode = CRYPT_MODE_CBC;
CryptSetKeyParam(context->aes_hKey, KP_MODE, (BYTE*)&dwMode, 0);tmp_blk_buff = VirtualAlloc(0, tbbs, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
plain_text = VirtualAlloc(0, context->in_size * 2, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
RtlSecureZeroMemory(tmp_blk_buff, tbbs);
RtlSecureZeroMemory(plain_text, context->in_size * 2);
new_bytes = (LPBYTE)plain_text;
// Decrypt data
do{
RtlSecureZeroMemory(tmp_blk_buff, tbbs);
if (pl_s <= AES_BLOCK_SIZE_){
p_block_size = pl_s;
eof = TRUE;
}
else{
p_block_size = AES_BLOCK_SIZE_;
pl_s -= AES_BLOCK_SIZE_;
}
CopyMemory(tmp_blk_buff, enc_bytes, p_block_size);
DWORD error = 0;
if (error = !CryptDecrypt(context->aes_hKey, NULL, eof, 0, (LPBYTE)tmp_blk_buff, &p_block_size))
{
error = GetLastError();
}
CopyMemory(new_bytes, tmp_blk_buff, p_block_size);
enc_bytes += AES_BLOCK_SIZE_;
new_bytes += p_block_size;
context->out_size += p_block_size;
} while (!eof);
context->out_buff = plain_text;
RtlSecureZeroMemory(tmp_blk_buff, tbbs);
VirtualFree(tmp_blk_buff, tbbs, MEM_RELEASE);
CryptReleaseContext(context->context, 0);
CryptDestroyKey(context->aes_hKey);
Задача ещё не решена.