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

标签 php encryption cryptography aes php-openssl

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

这是代码:

    <?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 的 block 大小)的倍数,就总是会成功。之后,它将尝试执行 PKCS#7 兼容的取消填充,这将失败(很有可能)。要使其不被取消填充,请在 OPENSSL_RAW_DATA 之外使用 OPENSSL_ZERO_PADDING

当然,您的加密功能也是如此。目前您收到的是填充明文的密文。如果输入明文是 block 大小的倍数(并且在示例代码中),这将恰好添加一个填充 block 。因此您还需要OPENSSL_ZERO_PADDING

关于php - 在 php 中使用 openssl 进行 AES-256-CBC 加密/解密十六进制字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44140853/

相关文章:

c# - 加密安全随机数生成器

python - 我可以使用 AES I.V.或随机数作为密码盐?

c - OpenSSL AES_cbc_encrypt 与 EVP 接口(interface)

java - Python 可以识别 Java 中使用 BCrypt 的哈希密码吗?

php - 如何使用 PHP 和 ajax 从 MySQL 加载标记?

c++ - 如何使用 Bluez5.50 通过 BLE 连接加密数据

java - Spring 的 BCrypt 实现

php - 在 PhpStorm 中隐藏选项卡标签中的文件扩展名

php - 每次迭代一个 Twig 循环时减去一个

php - 将转换为 json 字符串的对象发送到 php 脚本