使用phpseclib使用AES加密文本,使用C+解密文本+;Windows加密API
您好,我在尝试解密使用phpseclib用AES加密的AES文本时遇到了一个非常奇怪的问题 我使用RSA加密AES密钥,该密钥用于加密发送到服务器的消息。 服务器解密RSA加密的AES密钥,并使用它来解密传入的消息 还要加密回复 我通过将AES密钥导出为PLAINTEXTKEYBLOB来验证密钥是否相同 当我使用为加密原始消息而生成的hKey句柄使用WCAPI从服务器解密AES加密文本时,问题就出现了 cryptodecrypt()只会给我留下垃圾。解密不会产生原始消息 我还验证了我实际上是在解密加密的消息,而不是一些随机缓冲区 在尝试解密此消息之前,我还将发送一条包含公钥的加密消息,以便服务器可以加密下一个AES密钥。 这是成功的使用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()只会给我留下垃圾。解密不会产生原始消息 我还验证了我实际上是在解
我可以从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中遗漏了一些标志,但是还没有弄清楚是哪些标志。。。如有任何建议,我们将不胜感激