[英]How to decrypt PHP Openssl encryption with BASH command
我在PHP中加密密码,并希望在不同的盒子上解密它。 我没有运气,我宁愿能够从bash中解密它并回应它。 下面是PHP中的一个测试片段。
$textToEncrypt = "My super secret information.";
$encryptionMethod = "AES-256-CBC";
$secretHash = "Testkey";
//To encrypt
$encryptedMessage = openssl_encrypt($textToEncrypt, $encryptionMethod, $secretHash);
//To Decrypt
$decryptedMessage = openssl_decrypt($encryptedMessage, $encryptionMethod, $secretHash);
//Result
echo "Encrypted: $encryptedMessage <br>Decrypted: $decryptedMessage";
我已经尝试了很多方法在Ubuntu上解密它,甚至将数据存储到文件并将其输出到文件。 命令尝试是:
openssl aes-256-cbc -a -d -k Testkey -in foo.txt -out secrets.txt
其中foo.txt
是PHP加密返回的值, secrets.txt
是输出。 我怎样才能做到这一点?
值得注意的是,在评论中,没有IV的加密是危险的。 事实上,PHP的当前版本将发出警告。 IV可以使用openssl_random_pseudo_bytes()
函数随机生成,并与加密文本一起以明文形式传输。 它们不必是秘密,重要的是不要重复使用相同的密钥和IV组合,并且具有随机IV。
因此,如果你看一下这个函数的源代码 ,那么它不会将password
参数作为密码传递,而是作为密钥传递。 因此,要在命令行上使用openssl
,它需要是十六进制并传递给-K
选项,而不是-k
选项。 但是,你会收到一条错误,说“iv undefined”,所以你的PHP需要调整为包含一个:
<?php
$textToEncrypt = "My super secret information.\n";
$encryptionMethod = "AES-256-CBC";
$key = "Testkey";
$iv = openssl_random_pseudo_bytes(
openssl_cipher_iv_length($encryptionMethod)
);
$keyHex = bin2hex($key);
$ivHex = bin2hex($iv);
//To encrypt
$encryptedMessage = openssl_encrypt($textToEncrypt, $encryptionMethod, $key, 0, $iv);
//To Decrypt
$decryptedMessage = openssl_decrypt($encryptedMessage, $encryptionMethod, $key, 0, $iv);
//Result
printf(
"Decrypted message: %s\n\nkeyHex=%s\nivHex=%s\nencryptedMessage=%s\n",
$decryptedMessage,
escapeshellarg($keyHex),
escapeshellarg($ivHex),
escapeshellarg($encryptedMessage)
);
获得这些详细信息后,可以从命令行解密(在此处重用PHP变量名称):
echo -n "$encryptedMessage" | openssl aes-256-cbc -d -a -A -K "$keyHex" -iv "$ivHex"
另一种方式
#!/bin/bash
# create in bash keys
echo "generating private key"
openssl genrsa -out privkey.pem 2048
echo "signing private key"
openssl req -new -key privkey.pem -out certreq.csr -subj "/C=RO/ST=AB L=AB/O=None/OU=Department/CN=someweb.com"
echo "create a sign request"
openssl x509 -req -in certreq.csr -signkey privkey.pem -out newcert.pem
# end-of-bash-script
cp ./privkey.pem /path/to/apache/root/<some>
加密一些json文件
openssl smime -encrypt -aes256 -in ./json.txt -binary -outform DER -out ./json.xxx newcert.pem
# test decrypt here in bash
# openssl smime -decrypt -in json.xxx -inform DER -inkey privkey.pem -out json.dec
将其作为二进制文件发布到php
curl --request POST --data-binary @./json.xxx http://localhost/<some/>json.php
然后是json.php脚本@apache root
<?php
$rkey = file_get_contents("/var/www/html/privkey.pem");
$pkey = file_get_contents("/var/www/html/newcert.pem");
$data = file_get_contents("php://input");
$fenc = tempnam("", "enc");
$fdec = tempnam("", "dec");
file_put_contents($fenc,$data);
// openssl_pkcs7_decrypt ($fenc , $fdec , $pkey, $rkey ); unable to coerce parameter 3 to x509 cert
system("openssl smime -decrypt -in ${fenc} -inform DER -inkey privkey.pem -out ${fdec}");
echo file_get_contents($fdec);
?>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.