【问题标题】:Mcrypt not decryptingMcrypt不解密
【发布时间】:2017-07-27 21:04:00
【问题描述】:

我正在开发一个必须加密基本句子并回显结果的小程序。然后我希望能够复制粘贴结果并能够以与编码相同的方式解码文本。它不需要太安全,所以我选择使用 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 以确保它不是我在函数本身中搞砸的东西,它确实会正确解密它。但是当我试图将两者分开时,它没有。我被难住了。

【问题讨论】:

  • 您可能误解了加密的目的。如果它不需要安全,那为什么要加密呢?
  • 最好不要使用mcrypt,它是废弃软件,多年未更新,不支持标准PKCS#7(née PKCS#5)填充,只有非标准空填充可以'甚至不能与二进制数据一起使用。 mcrypt 有许多出色的 bugs 可以追溯到 2003 年。请考虑使用 defuseRNCryptor,它们提供了完整的解决方案并且正在维护并且是正确的。
  • 这只是一个练习,让我了解加密的概念。我已经深入研究了 OpenSLL 加密,但我运行的是旧版本的 PHP,所以这对我不起作用。
  • 如此糟糕的代码

标签: php encryption mcrypt


【解决方案1】:

您向encryptdecrypt 发送相同的输入,即:

$input = $_POST['text'];

encrypt 将加密成功,但您总是试图解密“解密”短语!

您必须传递encrypted 短语才能解密函数

不要忘记mcrypt_* 扩展已被弃用的重要说明:

这个扩展依赖于 libmcrypt,它已经死了,没有维护 2007.

请不要依赖它,考虑切换到维护良好的 替代品(openssl、crypt、密码散列函数、phpseclib、 password_compat...)

并且,尝试停止使用global变量,不推荐。

【讨论】:

  • @Sander 是:“停止使用全局变量”
  • 由于代码仅根据设置的按钮调用每个函数(为了完整性,我也应该添加 HTML 表单),这是否意味着文本无关紧要两者的输入相同吗?你可以选择“解密”并输入一个解密的文本来解密它,反之亦然。
  • 好吧,检查一下,3v4l.org/kP9pM,出于测试目的,在每个函数中回显$input 以检查传递的值。
猜你喜欢
  • 2017-01-03
  • 2013-01-20
  • 2017-06-04
  • 2013-12-28
  • 2014-02-01
  • 2011-12-26
  • 2015-10-09
  • 2011-01-27
  • 2011-01-24
相关资源
最近更新 更多