こんにちは、phpseclib を使用して AES で暗号化された AES テキストを復号化しようとしているときに、非常に奇妙な問題が発生しています。
サーバーへのメッセージを暗号化するために使用する AES キーを RSA 暗号化します。サーバーは 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);