php — шифровать текст с помощью AES с помощью phpseclib, расшифровывать текст с помощью C ++ Windows Crypto API

Здравствуйте, так что у меня возникла очень странная проблема при попытке расшифровать текст 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);

1

Решение

Задача ещё не решена.

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


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