2017-03-07 99 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