PHP openssl_decrypt大约有10%的时间返回奇怪的输出

时间:2017-12-14 11:27:53

标签: php encryption php-openssl

利用我在互联网上找到的所有知识,我想出了一个salt openssl加密和解密功能。它在90%的时间内工作,但每次在wile中,解密返回一个空的sting或与加密数据无关的随机字节。我正在使用的代码是:

function Encrypt($subject, $method, $saltLength, $key){
    if($method==0){
        $salt=random_bytes($saltLength);
        $key=hash('sha256', $salt.$key);
        $iv=random_bytes(16);
        $encrypt=base64_encode(openssl_encrypt($subject, 'aes-256-ctr', $key, 0, $iv));
        $return=base64_encode("$method:$salt:$iv:$encrypt");
    }
    return($return);
}
function Decrypt($subject, $key){
    $components = explode( ':', base64_decode($subject));
    $method=$components[0];
    if($method==0){
        $salt=$components[1];
        $key = hash('sha256', $salt.$key);
        $iv=$components[2];
        $encrypt=base64_decode($components[3]);
        $return=(openssl_decrypt($encrypt, 'aes-256-ctr', $key, 0, $iv));
    }
    return($return);
}

$testE=Encrypt('Test', 0, 20, 'Key0');
var_dump($testE);
echo('<br><br>');
$testD=Decrypt($testE, 'Key0');
var_dump($testD);
echo('<br><br>');
$testD=Decrypt($testE, 'Key0');
var_dump($testD);
echo('<br><br>');

此代码的错误结果示例如下:

string(72) "MDrVsJAIE8OFjyM6y5dt+xkij5m/rTrHTnzeWs0IRrTKvNR1L7wfOmJrSlNRWFIzUFQwPQ==" 

string(1) "�" 

string(1) "�" 

或者返回一个完全空的字符串:

string(72) "MDrQ+5c83vJXnva1OjrbJ2RWGjU5ajrwCn+qCneIIOqh48Gt0JmbOllsZFVUMHRuUFQwPQ==" 

string(0) "" 

string(0) "" 

我两次解密的原因是看故障是在解密还是加密,结果清楚地表明加密在某种程度上是错误的。

我的问题是导致数据错误加密的原因是什么? &安培;我可以改进这种方法并使其更安全吗?

1 个答案:

答案 0 :(得分:1)

虽然不是为什么会发生这种情况的答案,但结果往往是最重要的。

如果是这种情况,那么,如果你获得90%的准确率,一段时间的循环会很快让你上路......

while(strlen($testD) < 5) {
    $testD=Decrypt($testE, 'Key0');
}

如果您的目标是找出导致次要故障的原因,那么您可能需要更深入地了解核心代码。然而,在我的立场,“完成它并继续前进”往往是老板所说的,所以找到一个收集信息的工作解决方案通常是我必须要合作的。