2016-01-17 78 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); 
?> 
相關問題