一些字符串不会解密

时间:2015-11-15 17:26:33

标签: php string encryption

我有一个用盐/密码加密和解密字符串的功能,但是有一个问题,我加密任何字符串没有问题,但是如果解密它会解密一些字符串... < / p>

例如,它将解密&#34; Hello World&#34;,但不会&#34;登录&#34;或者&#34; RedeemToken&#34; ...我在下面使用的代码包含一些输出和调试内容:

function encrypt($data)
{
    $secret = "FUSIONIDISTOPNOTCHCODEDBYMELTYNET";
    //Generate a key from a hash
    $key = md5(utf8_encode($secret), true);

    //Take first 8 bytes of $key and append them to the end of $key.
    $key .= substr($key, 0, 8);

    //Pad for PKCS7
    $blockSize = mcrypt_get_block_size('tripledes', 'ecb');
    $len = strlen($data);
    $pad = $blockSize - ($len % $blockSize);
    $data .= str_repeat(chr($pad), $pad);

    //Encrypt data
    $encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb');

    return base64_encode($encData);
}

function decrypt($data)
{
    $secret = "FUSIONIDISTOPNOTCHCODEDBYMELTYNET";
    //Generate a key from a hash
    $key = md5(utf8_encode($secret), true);

    //Take first 8 bytes of $key and append them to the end of $key.
    $key .= substr($key, 0, 8);

    $data = base64_decode($data);

    $data = mcrypt_decrypt('tripledes', $key, $data, 'ecb');

    $block = mcrypt_get_block_size('tripledes', 'ecb');
    $len = strlen($data);
    $pad = ord($data[$len-1]);

    return substr($data, 0, strlen($data) - $pad);
}

上面的函数也是这样使用的:

echo encrypt($string);
echo decrypt($string);

加密但不加密的一些字符串示例:

Login - Doesn't Decrypt
RedeemToken - Doesn't Decrypt
Blacklist - Decrypt Works
Email - Decrypt Works

如果有人可以指出问题或帮助,请告诉我,谢谢!

这是我的代码:

使用 - "http://example.com/test.php?st=xeJuD3+A0Po="

<?php

$string123 = mysql_escape_string($_GET["st"]);

echo decrypt($string123);

function encrypt($data)
{
    $secret = "FUSIONIDISTOPNOTCHCODEDBYMELTYNET";
    //Generate a key from a hash
    $key = md5(utf8_encode($secret), true);

    //Take first 8 bytes of $key and append them to the end of $key.
    $key .= substr($key, 0, 8);

    //Pad for PKCS7
    $blockSize = mcrypt_get_block_size('tripledes', 'ecb');
    $len = strlen($data);
    $pad = $blockSize - ($len % $blockSize);
    $data .= str_repeat(chr($pad), $pad);

    //Encrypt data
    $encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb');

    return base64_encode($encData);
}

function decrypt($data)
{
    $secret = "FUSIONIDISTOPNOTCHCODEDBYMELTYNET";
    //Generate a key from a hash
    $key = md5(utf8_encode($secret), true);

    //Take first 8 bytes of $key and append them to the end of $key.
    $key .= substr($key, 0, 8);

    $data = base64_decode($data);

    $data = mcrypt_decrypt('tripledes', $key, $data, 'ecb');

    $block = mcrypt_get_block_size('tripledes', 'ecb');
    $len = strlen($data);
    $pad = ord($data[$len-1]);

    return substr($data, 0, strlen($data) - $pad);
}
?>

1 个答案:

答案 0 :(得分:1)

发现;)

在您的网址中,使用http://example.com/test.php?st=xeJuD3%2BA0Po%3D作为=+,并且不允许在网址中使用其他字符。

查看http://php.net/manual/fr/function.rawurlencode.php以从base64加密数据中制作正确的网址

如果在点击PHP之前无法更改网址,则必须更改+中的空格:

$_GET['st'] = str_replace(' ', '+', $_GET['st']);

顺便说一句,删除$string123 = mysql_escape_string($_GET["st"]); mysql_是为了mysql,没别的,它不是你施放的魔法咒语。它唯一能做的就是将'更改为\',它无论如何都无法帮到你;即使在MySQL中它现在已经折旧,你需要使用PDO或mysqli

为此:

<?php
function encrypt($data)
{
    $secret = "FUSIONIDISTOPNOTCHCODEDBYMELTYNET";
    //Generate a key from a hash
    $key = md5(utf8_encode($secret), true);

    //Take first 8 bytes of $key and append them to the end of $key.
    $key .= substr($key, 0, 8);

    //Pad for PKCS7
    $blockSize = mcrypt_get_block_size('tripledes', 'ecb');
    $len = strlen($data);
    $pad = $blockSize - ($len % $blockSize);
    $data .= str_repeat(chr($pad), $pad);

    //Encrypt data
    $encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb');

    return base64_encode($encData);
}

function decrypt($data)
{
    $secret = "FUSIONIDISTOPNOTCHCODEDBYMELTYNET";
    //Generate a key from a hash
    $key = md5(utf8_encode($secret), true);

    //Take first 8 bytes of $key and append them to the end of $key.
    $key .= substr($key, 0, 8);

    $data = base64_decode($data);

    $data = mcrypt_decrypt('tripledes', $key, $data, 'ecb');

    $len = strlen($data);
    $pad = ord($data[$len-1]);

    return substr($data, 0, strlen($data) - $pad);
}

echo "'". ($a = encrypt('Email'))."'<br>\n";
echo "'".decrypt($a)."'<br>\n";
echo "'".decrypt('AA/PpTmKWjY=')."'<br>\n";
echo "'".($e= encrypt('Login'))."'<br>\n";
echo "'".decrypt($e)."'<br>\n";
echo "'".decrypt('xeJuD3+A0Po=')."'<br>\n";

我明白了:

'AA/PpTmKWjY='
'Email'
'Email'
'xeJuD3+A0Po='
'Login'
'Login'

所以,对我而言,它工作得很好......