1

你好,所以我在尝试解密使用 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);
4

0 回答 0