2016-06-08 94 views
-1

我一直在PHP OpenSSL的內置方法的一些問題。我試圖通過嘗試不同的方法來縮小問題範圍。我想以下幾點:PHP的OpenSSL加密與命令行Encypt

$input = "this is a test string"; 
$opensslCommand = "echo \"{$input}\" | openssl enc -AES-128-CBC -a -nosalt -K " . bin2hex($hashing_secret) . " -iv ". bin2hex($iv); 

$first = openssl_encrypt($input, "AES-128-CBC", $hashing_secret, 0, $iv); 
$second = exec($opensslCommand); 

print(urlencode($first) . "<br/>"); 
print(urlencode($second) . "<br/>"); 

然而,上面的輸出是:

hn%2FZkGKl9EQ7XgFFytcPkTPxJST2jCKEVDoojmkz8xs%3D 
hn%2FZkGKl9EQ7XgFFytcPkdQESeAPqlFNwJivth28m9o%3D 

正如你可以看到,他們開始在輸出的中間出現分歧。對於內置或命令行,我的配置是否有錯?

第三方編輯:
使更多的輸出感:

Base64編碼:
hn/ZkGKl9EQ7XgFFytcPkTPxJST2jCKEVDoojmkz8xs=
hn/ZkGKl9EQ7XgFFytcPkdQESeAPqlFNwJivth28m9o=

在十六進制:
867FD990 62A5F444 3B5E0145 CAD70F91 33F12524 F68C2284 543A288E 6933F31B
867FD990 62A5F444 3B5E0145 CAD70F91 D40449E0 0FAA514D C098AFB6 1DBC9BDA

+1

檢查二進制很明顯,前16個字節是所述第一塊和相同,則第二個16個字節是所述第二塊和不同。所以這可能是一個加密模式問題,即要加密的數據的末尾部分是不同的。 – zaph

+0

一個簡單的在線方式來檢查加密是Cryptomathic [AES計算器](http://extranet.cryptomathic.com/aescalc)。還有其他算法的其他計算器。 – zaph

回答

2

echo是這裏的罪魁禍首。您可以使用echo的某個參數來抑制附加到其輸入字符串的換行符:-n。事實證明,這是隨着我對openssl的輸入而得到的。

$opensslCommand = "echo -n \"{$input}\" | openssl enc -AES-128-CBC -a -nosalt -K " . bin2hex($hashing_secret) . " -iv ". bin2hex($iv); 

是正確的命令