PHP openssl_decrypt returns 大约 10% 的时间出现奇怪的输出

PHP openssl_decrypt returns strange output about 10% of the time

利用我在互联网上可以找到的所有知识,我想出了一个 salt openssl 加密和解密功能。它在 90% 的时间都有效,但偶尔解密 returns 会产生一个与加密数据无关的空字符串或随机字节。我使用的代码是:

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) "�" 

或者完全空字符串的return:

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

string(0) "" 

string(0) "" 

我解密两次是为了看是解密还是加密出了问题,结果很明显是加密出了问题

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

虽然这不是为什么会发生的答案,但通常结果才是最重要的。

如果是这样,那么,如果您获得 90% 的准确率,while 循环将很快让您上路......

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

如果您的目标是找出导致小错误的原因,那么您可能需要更深入地查看核心代码。然而,在我的立场上,"get it done and move on" 通常是老板所说的,所以找到一个收集信息的有效解决方案通常是我必须处理的事情。