我正在用 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 会对此发出警告。可以使用 openssl_random_pseudo_bytes() 函数随机生成 IV,并与加密文本一起以明文形式传输。它们不必是 secret 的,重要的是不要重复使用相同的 key 和 IV 组合,并且具有随机的 IV。

因此,顺便说一下,如果您查看 the source for the function ,它不会将 password 参数作为密码传递,而是作为 key 传递。所以为了在命令行上使用 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"

关于php - 如何使用 BASH 命令解密 PHP Openssl 加密,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34835336/

10-12 16:11
查看更多