2016-06-08 96 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); 

是正确的命令