AES-256-CBC 加密/解密十六进制字符串在 php 中使用 openssl .



我是一个菜鸟开发人员,我正在尝试解密一些数据,但是当我在PHP中使用OpenSSL时,我没有收到任何响应。此外,当尝试加密数据时,OpenSSL添加一个字符块。

这是代码:

    <?php
    $dataToDecrypt = hex2bin("C2E5CDFE8BBFBC7350D40538434824DD3E11520B89A5BFDE24FA064DB2EED6EA");
    $aesKey = hex2bin("E3FB8EA130722FA99266B96B77C2735C39393939393939393920202020202020");
    $iv = hex2bin("00000000000000000000000000000000");
    $result = openssl_decrypt($dataToDecrypt, 'AES-256-CBC', $aesKey, OPENSSL_RAW_DATA, $iv);
    echo bin2hex($result);
?>

$result应该是:

C3A6149C73FFBE4EAD36DC62FE40877D17CD690F37B06058CA3D65A345CC8212

我已经在 VB 甚至 AES 加密网页 (http://aes.online-domain-tools.com/( 上尝试过这个,结果是正确的。但是当尝试使用PHP时,我没有得到答案。

我注意到使用相同的信息加密时,加密的数据是不同的。这是代码:

    <?php
    $dataToEncrypt = hex2bin("C3A6149C73FFBE4EAD36DC62FE40877D17CD690F37B06058CA3D65A345CC8212");
    $aesKey = hex2bin("E3FB8EA130722FA99266B96B77C2735C39393939393939393920202020202020");
    $iv = hex2bin("00000000000000000000000000000000");
    $result = openssl_encrypt($dataToEncrypt, 'AES-256-CBC', $aesKey, OPENSSL_RAW_DATA, $iv);
    echo bin2hex($result);
?>

当我加密时,结果是:

C2E5CDFE8BBFBC7350D40538434824DD3E11520B89A5BFDE24FA064DB2EED6EA3A3ED407DC78D6AF9030BAB90CB40EAD

我得到的比预期的多 32 个字符(3A3ED407DC78D6AF9030BAB90CB40EAD(。当我在 VB 中加密或使用前面提到的网页时,我没有得到这 32 个额外的字符。

为什么会这样?我错过了什么吗?几天来我一直在寻找答案。任何帮助,不胜感激。

要在PHP解密期间查看某些内容,您需要打开警告消息。

本质上,openssl_decrypt调用将首先解密您的密文。只要您的密文是 16 字节的倍数(AES 的块大小(,这将始终成功。之后,它将尝试执行 PKCS#7 兼容的取消填充,这将失败(很有可能(。要使其不取消填充,请除使用OPENSSL_RAW_DATA外,还使用OPENSSL_ZERO_PADDING

当然,您的加密功能也是如此。当前,您会收到填充明文的密文。如果输入明文是块大小的倍数(并且它在您的示例代码中(,这将只添加一个填充块。所以你也需要OPENSSL_ZERO_PADDING那里。

最新更新