Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.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
AES-256-CBC在php中使用openssl加密/解密十六进制字符串_Php_Encryption_Cryptography_Aes_Php Openssl - Fatal编程技术网

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

AES-256-CBC在php中使用openssl加密/解密十六进制字符串,php,encryption,cryptography,aes,php-openssl,Php,Encryption,Cryptography,Aes,Php Openssl,我是一名noob开发人员,我试图解密一些数据,但当我在PHP中使用OpenSSL时,没有收到任何响应。此外,在尝试加密OpenSSL数据时,请添加一个字符块 代码如下: <?php $dataToDecrypt = hex2bin("C2E5CDFE8BBFBC7350D40538434824DD3E11520B89A5BFDE24FA064DB2EED6EA"); $aesKey = hex2bin("E3FB8EA130722FA99266B96B77C2735

我是一名noob开发人员,我试图解密一些数据,但当我在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);
?>
    <?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);
?>
我已经在VB上试过了,甚至在AES encription网页()上也试过了,结果是正确的。但是当我尝试使用PHP时,我没有得到答案

我注意到当使用相同的信息进行加密时,加密的数据是不同的。代码如下:

    <?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);
?>
    <?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);
?>
我比预期多了32个字符(
3A3ED407DC78D6AF9030BAB90CB40EAD
)。当我在VB中加密或使用前面提到的网页时,我不会得到这32个额外字符


为什么会这样?我错过什么了吗?我已经寻找答案好几天了。非常感谢您的帮助。

要在PHP解密过程中看到一些东西,您需要打开警告消息

本质上,
openssl\u decrypt
调用将首先解密密文。只要您的密文是16字节的倍数(AES的块大小),这将始终成功。之后,它将尝试执行PKCS#7兼容的取消添加,这将失败(概率很高)。要使其不被取消加载,除了使用
OPENSSL\u原始\u数据
之外,还可以使用
OPENSSL\u零\u填充


当然,加密功能也是如此。当前,您将收到填充明文的密文。如果输入的纯文本是块大小的倍数(并且在示例代码中),这将只添加一个填充块。所以你也需要
OPENSSL\u ZERO\u PADDING

还没有测试过,所以请告诉我是否解决了你的问题。只是想澄清一下,你可以使用
3
(as
$options
)来启用
OPENSSL\u ZERO\u PADDING
OPENSSL\u原始数据
(这确实产生了正确的输出)。很高兴它成功了,当然,欢迎来到StackOverflow:)顺便问一下,你能帮我检查一下encrypt是否适用于密文,例如31字节而不是你现在尝试的32字节吗?我想知道OPENSSL_ZERO_PADDING实际上是零填充(用零填充)还是不填充(在这种情况下,该选项的名称将非常糟糕)。@JocelynGonzálezvanhorn好的,在这种情况下,该选项的名称非常糟糕,谢谢您为我尝试!如果你需要一个常量名来表示3的值,你可以使用
OPENSSL\u RAW\u NO\u PADDING
。该死,我为此挠头了好几个小时-添加
OPENSSL\u ZERO\u PADDING
解决了这个问题!谢谢你,我的朋友!您可以使用backticks:`而不是单引号来突出显示内联代码。你的英语很好,但我建议使用大写的名称,如OpenSSL和PHP,使你的问题看起来更专业。您可以单击查看我的更改。