2017-03-07 78 views
0

我正在研究一個小程序,它必須加密一個基本句子並回顯結果。然後,我希望能夠複製粘貼結果並能夠以與我編碼相同的方式解碼文本。它不需要太安全,所以我選擇使用Mcrypt。Mcrypt不解密

當我嘗試解密時,它會給出奇怪的(ASCII?)字母,我不明白它們來自哪裏。試圖用base64編碼/解碼解決它,但這也沒有幫助。我需要改變以使其正常工作?

<?php 

// Define Mcrypt variables 
$enc = MCRYPT_RIJNDAEL_128; 
$mode = MCRYPT_MODE_CBC; 
$key = 'SanderDitIsNodigVoor16bi'; 
$iv = mcrypt_create_iv(mcrypt_get_iv_size($enc, $mode), MCRYPT_DEV_URANDOM); 

// Check if 'submit' is set 
if (isset($_POST['submit'])) { 

    // Check if 'text' is set 
    if (!empty($_POST['text'])) { 

     // Check if 'crypt' is set 
     if (isset($_POST['crypt'])) { 

      // Retrieve 'text' 
      $input = $_POST['text']; 

      // Check for encrypt/decrypt 
      switch ($_POST['crypt']) { 
       case 'encrypt': 
        $result = encrypt(); 
        break; 
       case 'decrypt': 
        $result = decrypt(); 
        break; 
      } 

      echo $result; 
     } 

     // If 'crypt' is not set 
     else { 
      echo 'Please select encrypt or decrypt.'; 
     } 
    } 

    // If 'text' is not set 
    else { 
     echo 'Please fill in some text.'; 
    } 
} 

function encrypt() { 
    global $enc, $key, $input, $mode, $iv; 
    $encrypted = mcrypt_encrypt($enc, $key, $input, $mode, $iv); 
    $output = base64_encode($encrypted); 
    return $output; 
} 

function decrypt() { 
    global $enc, $key, $input, $mode, $iv; 
    $decrypted = base64_decode($input); 
    $output = mcrypt_decrypt($enc, $key, $decrypted, $mode, $iv); 
    return $output; 
} 

?> 

要清楚,如果我包括mcrypt_decrypt在加密,以確保它不是我的函數本身搞砸了,它正確地解密它。但是,當我試圖分開這兩個,它不。我很難過。

+2

您可能誤解了加密的目的。如果它不需要安全,那麼爲什麼要開始加密? – happymacarts

+2

最好不要使用mcrypt,它是放棄的,多年未更新並且不支持標準PKCS#7(néePKCS#5)填充,只有非標準的null填充甚至不能用於二進制數據。 mcrypt有很多優秀的[bug](https://sourceforge.net/p/mcrypt/bugs/)可以追溯到2003年。相反,考慮使用[defuse](https://github.com/defuse/php-encryption)或者[RNCryptor](https://github.com/RNCryptor),他們提供了一個完整的解決方案,並且正在維護和正確。 – zaph

+0

這只是一個練習,讓我的頭腦圍繞加密的概念。我已經深入OpenSLL加密,但我運行的是PHP的舊版本,所以這對我不起作用。 – Sander

回答

1

要發送到兩個encryptdecrypt相同的輸入,這就是:

$input = $_POST['text']; 

加密將成功地加密,但你總是試圖解密「解密」這句話!

你必須通過encrypted短語來解密功能

,不要忘了重要的注意,mcrypt_*擴展已被棄用:

這個擴展依賴於libmcrypt是死的,因爲沒有維護 2007.

請不要依賴它,考慮切換到維護良好的 替代方案(openssl,crypt,密碼散列函數,phpseclib, password_compat ...)

並試圖停止使用global變量,因此不推薦。

+1

@Sander是:「停止使用全局變量」 – zaph

+0

由於代碼只根據設置的按鈕調用每個函數(爲了完整性,我也應該添加HTML表單),這並不意味着它不會這兩個文本輸入是相同的嗎?您可以選擇「解密」並輸入解密文本來解密,反之亦然。 – Sander

+0

好了,請查看https://3v4l.org/kP9pM,出於測試心理的考慮,請在每個函數內部echo $'input'來檢查傳入的值。 – hassan