Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用phpseclib使用AES加密文本,使用C+解密文本+;Windows加密API_Php_C++_Encryption_Phpseclib_Wincrypt - Fatal编程技术网

使用phpseclib使用AES加密文本,使用C+解密文本+;Windows加密API

使用phpseclib使用AES加密文本,使用C+解密文本+;Windows加密API,php,c++,encryption,phpseclib,wincrypt,Php,C++,Encryption,Phpseclib,Wincrypt,您好,我在尝试解密使用phpseclib用AES加密的AES文本时遇到了一个非常奇怪的问题 我使用RSA加密AES密钥,该密钥用于加密发送到服务器的消息。 服务器解密RSA加密的AES密钥,并使用它来解密传入的消息 还要加密回复 我通过将AES密钥导出为PLAINTEXTKEYBLOB来验证密钥是否相同 当我使用为加密原始消息而生成的hKey句柄使用WCAPI从服务器解密AES加密文本时,问题就出现了 cryptodecrypt()只会给我留下垃圾。解密不会产生原始消息 我还验证了我实际上是在解

您好,我在尝试解密使用phpseclib用AES加密的AES文本时遇到了一个非常奇怪的问题

我使用RSA加密AES密钥,该密钥用于加密发送到服务器的消息。 服务器解密RSA加密的AES密钥,并使用它来解密传入的消息

还要加密回复

我通过将AES密钥导出为PLAINTEXTKEYBLOB来验证密钥是否相同

当我使用为加密原始消息而生成的hKey句柄使用WCAPI从服务器解密AES加密文本时,问题就出现了

cryptodecrypt()只会给我留下垃圾。解密不会产生原始消息

我还验证了我实际上是在解密加密的消息,而不是一些随机缓冲区

在尝试解密此消息之前,我还将发送一条包含公钥的加密消息,以便服务器可以加密下一个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);
LPBYTE enc_bytes=(LPBYTE)context->in_buff;
DWORD pl_s=上下文->大小不一;
LPVOID tmp_blk_buff=NULL;
LPVOID纯文本=NULL;
LPBYTE new_bytes=NULL;
DWORD p_块大小=NULL;
BOOL-eof=FALSE;
DWORD tbbs=TMP_块_缓冲区_大小(上下文->in_大小);
DWORD dwMode=密码模式CBC;
CryptSetKeyParam(上下文->aes_hKey,KP_模式,(字节*)和dwMode,0);
tmp_blk_buff=VirtualAlloc(0,tbbs,MEM_COMMIT,MEM_RESERVE,PAGE_READWRITE);
纯文本=VirtualAlloc(0,上下文->in_size*2,MEM_COMMIT,MEM_RESERVE,PAGE_READWRITE);
RtlSecureZeroMemory(tmp_blk_buff,tbbs);
RtlSecureZeroMemory(纯文本,上下文->英寸大小*2);
新字节=(LPBYTE)纯文本;
//解密数据
做{
RtlSecureZeroMemory(tmp_blk_buff,tbbs);
if(pl_s aes_hKey,NULL,eof,0,(LPBYTE)tmp_blk_buff和p_block_size))
{
error=GetLastError();
}
CopyMemory(新字节、tmp_blk_buff、p_块大小);
enc_字节+=AES_块大小;
新的_字节+=p_块_大小;
上下文->输出大小+=p\U块大小;
}而(!eof);
context->out\u buff=纯文本;
RtlSecureZeroMemory(tmp_blk_buff,tbbs);
VirtualFree(tmp_blk_buff、tbbs、MEM_发布版);
CryptReleaseContext(上下文->上下文,0);
加密密钥(上下文->aes_hKey);

i尝试使用AES hKey作为会话密钥,在这里,我使用用于解密消息的相同密钥对消息进行加密。(服务器端)。我验证了密钥匹配(服务器/客户端),但仍然没有成功。更新:我已经核实了钥匙和信息。所以这让我相信,我在WCAPI中遗漏了一些标志,或者在phpseclib中遗漏了一些标志,但是还没有弄清楚是哪些标志。。。任何建议都值得赞赏。我尝试使用AES hKey作为会话密钥,在此之前,我使用用于解密消息的相同密钥对消息进行加密。(服务器端)。我验证了密钥匹配(服务器/客户端),但仍然没有成功。更新:我已经核实了钥匙和信息。所以这让我相信,我在WCAPI中遗漏了一些标志,或者在phpseclib中遗漏了一些标志,但是还没有弄清楚是哪些标志。。。如有任何建议,我们将不胜感激