2016-03-31 304 views
1

我試圖將我的加密從mcrypt遷移到openssl,但解密仍然失敗。代碼下面顯示了我的加密功能。我將var_dump放置在加密函數中,以驗證解密是否使用了相同的變量,但事實並非如此。openssl_decrypt總是返回false

我嘗試了以下修改代碼,無工作:

  • base64_decode($encrypted)
  • 只是出於好奇base64_encode($encrypted)
  • 與選項所有這些變體設置爲:0(默認值),OPENSSL_RAW_DATA, OPENSSL_ZERO_PADDING

function encryptString($data){ 
    $key = "1A534"; 

    do{ 
     $iv = random_bytes(100); 
    }while(strpos($iv,"|Z|")!==false); 

    $encrypted = openssl_encrypt($data,"aes-256-gcm",$key,false,$iv); 
    var_dump(openssl_decrypt($encrypted,"aes-256-gcm",$key,OPENSSL_RAW_DATA,$iv)); 
    $output = $iv . "|Z|" . $encrypted; 
    $output = base64_encode($output); 
    return $output; 
} 

PHP版本爲7.0.5-1 + deb.sury.org〜可信賴+ 1

OpenSSL的版本是OpenSSL的1.0.2g 2016年3月1日

爲什麼保持openssl_decrypt返回false?我用上面的行成功加密了相同的變量。

+1

我認爲這將不會工作,直到PHP 7.1,因爲有認證標籤的錯誤。 –

+0

看起來沒錯。無GCM密碼正常工作。 – Us3r

+0

我在這種情況下使用7.1,但仍然在所有情況下返回false。 – Dockstar

回答

0

由於AEAD不受支持,它不適用於PHP < 7.1。

您可以使用the library I created(PHP 5.4+和7.0+)。在PHP 7.1, OpenSSL的 - - libCrypto extension, - 純PHP實現:

根據您的環境,它將測試和使用以下方法。

請注意,與其他方法相比,純PHP方法非常慢。