簡體   English   中英

PHP openssl_decrypt大約有10%的時間返回奇怪的輸出

[英]PHP openssl_decrypt returns strange output about 10% of the time

利用我在互聯網上可以找到的所有知識,我想到了一個salt openssl加密和解密功能。 它可以在90%的時間內工作,但每次解密一次,解密都會返回一個空的字符串或與加密數據無關的隨機字節。 我使用的代碼是:

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

我進行兩次解密的原因是查看錯誤是在解密還是在加密中,結果清楚地表明加密在某種程度上是錯誤的。

我的問題是什么導致數據加密錯誤? &我可以改進此方法並使它更加安全嗎?

雖然不是為什么會發生的答案,但結果往往是最重要的。

如果真是這樣,那么,如果您獲得90%的准確度,則while循環將迅速帶您上路.....

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

如果您的目標是找出導致次要錯誤的原因,那么您可能必須更深入地研究核心代碼。 但是,在我的職位上,老板經常說“完成並繼續前進”,因此我經常需要尋找一種可行的解決方案來收集信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM