2016-01-17 74 views
3

我正在用PHP加密密码,并且想要在另一个盒子上解密它。我没有运气,我宁愿能够从bash中解密它并回应它。以下是PHP中的测试代码片段。如何使用BASH命令解密PHP Openssl加密

$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是输出。我怎样才能做到这一点?

+1

不使用初始化向量(IV)是不是一个好主意;也许它不工作,因为它很害怕。 –

+0

如果我添加了,我的php将会是什么样子,我想它的格式是如何在PHP和bash之间进行的。 – Hydtek

+0

'-k Testkey'将从密码'Testkey'派生出一个密钥,而在php'openssl_encrypt(...,...,'Testkey')'将直接使用'Testkey'作为密钥。是否真的有必要以这种方式使用openssl命令行工具(即a)在所有b)中直接使用,而不需要其他程序/脚本)? – VolkerK

回答

1

正如在评论中那样,重复说明没有IV的加密是危险的。事实上,当前版本的PHP将发出警告。 IV可以使用openssl_random_pseudo_bytes()函数随机生成,并且与加密文本一起清晰地传输。他们不必保守秘密,重要的不是重复使用相同的密钥和IV组合,而是随机使用IV。

所以,有了这样的方式,如果你看看the source for the function,它没有经过password参数作为密码,而是作为重点。因此,对于在命令行上使用openssl,它需要以十六进制格式传递给-K选项,而不是-k选项。但是,你会回来说:“IV不确定”,因此需要进行调整,以包括一个你的PHP错误:

$textToEncrypt = "My super secret information."; 
$encryptionMethod = "AES-256-CBC"; 
$key    = "Testkey"; 
$iv    = "4toij35unvouqo{2"; //must be 16 bytes 

$keyHex   = unpack("H*", $key)[1]; 
$ivHex   = unpack("H*", $iv)[1]; 

//To encrypt 
$encryptedMessage = openssl_encrypt($textToEncrypt, $encryptionMethod, $key, 0, $iv); 

//To Decrypt 
$decryptedMessage = openssl_decrypt($encryptedMessage, $encryptionMethod, $key, 0, $iv); 

//Result 
echo "Hex key: $keyHex<br/>\nHex IV: $ivHex<br/>\nEncrypted: $encryptedMessage<br/>\nDecrypted: $decryptedMessage<br/>\n"; 

一旦你有了这些细节,你可以在命令行解密(重复使用PHP这里变量名):

echo -n "$encryptedMessage" | openssl aes-256-cbc -d -a -K "$keyHex" -iv "$ivHex" 
+1

我试过这样的代码,但是在linux上,由于“错误的最终块长度”,我得到了openssl错误“坏解密”。命令:echo -n“o69dxUStEeJffwdvfiTjt0vOliLcNXZNbRrH18JbyRU =”| openssl aes-256-cbc -d -a -K“546573746b6579”-iv“34746f696a3335756e766f75716f7b32” – QuickPrototype

0

其他的方式

#!/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脚本@阿帕奇根

<?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); 
?> 
相关问题