我是一个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);
?>
$result
应该是:
C3A6149C73FFBE4EAD36DC62FE40877D17CD690F37B06058CA3D65A345CC8212
我在VB上尝试了这个,甚至在AES encription网页(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个额外的字符。
为什么会这样?我错过了什么吗?几天来我一直在寻找答案。任何帮助表示赞赏。
答案 0 :(得分:1)
要在PHP解密期间查看内容,您需要打开警告消息。
基本上openssl_decrypt
调用将首先解密您的密文。只要您的密文是16字节的倍数(AES的块大小),这将始终成功。之后,它将尝试执行PKCS#7兼容的unpadding,这将失败(很有可能)。要使其不是unpad,请使用OPENSSL_ZERO_PADDING
以及<{em>} OPENSSL_RAW_DATA
。
当然,加密功能也是如此。目前您收到填充明文的密文。如果输入明文是块大小的倍数(并且它在您的示例代码中),这将添加恰好一个填充块。所以你也需要OPENSSL_ZERO_PADDING
。