你好,所以我在尝试解密使用 phpseclib 使用 AES 加密的 AES 文本时遇到了一个非常奇怪的问题。
我 RSA 加密了一个 AES 密钥,我用它来加密发往服务器的消息。服务器解密 RSA 加密的 AES 密钥并使用它来解密传入的消息。
还可以加密回复。
我通过将 AES 密钥导出为 PLAINTEXTKEYBLOB 来验证密钥是否相同。
当我使用为加密原始消息而生成的 hKey HANDLE 使用 WCAPI 从服务器解密 AES 加密文本时,问题就出现了。
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);
这里是 C++
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);