AES在终端中加密,在PHP中解密

AES在终端中加密,在PHP中解密,php,security,encryption,terminal,cryptography,Php,Security,Encryption,Terminal,Cryptography,我遇到过其他线程,有类似的问题,但由于PHP最近发生了变化(即删除了mcrypt),我正在寻求一些建议,告诉我如何最好在2017/18年使用OpenSSL解决这个问题。 使用Mac终端中的echo“此字符串将被加密”| openssl enc-aes-256-cbc-a-pass:123,我能够对字符串进行密码加密,现在希望将其(作为参数)传递到服务器端PHP函数中进行解密 研究了这个问题后,我发现这是可能的,但它使用了现在删除的mcrypt函数。进一步阅读中的内容,我还不知道如何将这个加密命令

我遇到过其他线程,有类似的问题,但由于PHP最近发生了变化(即删除了mcrypt),我正在寻求一些建议,告诉我如何最好在2017/18年使用OpenSSL解决这个问题。

使用Mac终端中的
echo“此字符串将被加密”| openssl enc-aes-256-cbc-a-pass:123
,我能够对字符串进行密码加密,现在希望将其(作为参数)传递到服务器端PHP函数中进行解密

研究了这个问题后,我发现这是可能的,但它使用了现在删除的mcrypt函数。进一步阅读中的内容,我还不知道如何将这个加密命令转换为它的PHP解密等价物

这是我到目前为止实现的,再一次,它不能与终端生成的加密一起工作,只有一个是用PHP创建的(这里没有显示)


OpenSSL使用专有的KDF,您可能不想在PHP代码中复制它。但是,您可以使用
-K
标志将密钥作为纯十六进制传递,从而避免KDF:

echo 'blah' | openssl enc -aes-256-cbc -K 0000000000000000000000000000000000000000000000000000000000000000

这里,大的十六进制字符串是您的256位密钥,十六进制编码。此加密操作将与您的PHP兼容。

请记住,AES仅对特定的密钥大小进行操作。您使用AES-256加密,只传递24位密钥(“123”)。这是可能的,因为OpenSSL使用KDF从该密码派生一个可接受长度的密钥。
openssl\u decrypt
函数不执行此操作,因此通过将
123
作为密钥传递,您已经在调用未定义的行为。您应该确定OpenSSL使用的KDF是什么,并将其复制到PHP代码中。@LukePark我整个周末都在尝试各种长度的值和函数。包括更改密钥中的字符数。然而,我不明白为什么终端的OpenSSL与PHP中的OpenSSL解密命令不兼容。有人能给出一个与我的问题上下文相关的代码示例吗?我可以分别在终端和PHP中加密/解密,但不能在某种程度上不在一种语言中加密,在另一种语言中解密。非常感谢您的帮助。您是否阅读了我的回复或。。。?你按我说的做了吗?KDF是最重要的。感谢您的澄清。为了得到URL友好的字符串,我在方法后面添加了
-a
标志,就像我原来的文章一样。从终端运行上述命令返回未定义的
iv
,因此我在末尾添加了
-iv
,以及另一个值,但是PHP说:
警告:openssl\u decrypt:IV传递的长度为32字节,比所选密码所期望的16字节长…
在简单的英语中是有意义的,所以我去掉了1/2,再次开始加密(这次只使用了
-IV
参数中一半的字符)。在另一边解密时没有运气。@程序员您在PHP代码中也使用了IV吗?@ProGrammer IV应该是16字节而不是8字节。您也不是base64决定PHP中的密文。@ProGrammer它是十六进制编码的。。。每个字节两个字符,因此IV只有8个字节。长度是原来的两倍…我通过在
$output
行中包含
hex2bin()
函数,成功地使解密部分工作。非常感谢。我现在想改变方向:也许你们有兴趣帮助我。再次感谢。
<?php
$encrypted_string = base64_decode($_GET['data']);
$key = 'B374A26A71490437AA024E4FADD5B497FDFF1A8EA6FF12F6FB65AF2720B59CCF';
$iv = '64299685b2cc8da5';

$output = openssl_decrypt($encrypted_string, 'AES-256-CBC', hex2bin($key), OPENSSL_RAW_DATA, hex2bin($iv));
print "Decrypted Data: <$output>\n";
?>
echo 'blah' | openssl enc -aes-256-cbc -K 0000000000000000000000000000000000000000000000000000000000000000