【问题标题】:Some Strings Won't Decrypt有些字符串不会解密
【发布时间】:2015-11-16 03:13:07
【问题描述】:

我有一个用盐/密码加密和解密字符串的功能,但是有一个问题,我加密任何字符串都没有问题,但是解密它在解密一些字符串时有问题......

例如,它将解密“Hello World”,但不能解密“Login”或“RedeemToken”...我使用的代码如下所示,其中包含一些输出和调试内容:

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);
}
?>

【问题讨论】:

  • echo decrypt(&lt;STRING&gt;);? &lt;STRING&gt; 来自哪里?应该是你从encrypt得到的密文
  • @ArtjomB。我把它作为一个占位符,但这就是字符串所在的地方。
  • mysql_escape_string => WTFô_O ???
  • 您的echo decrypt($string); 错误。解密适用于加密的字符串,而不是原始字符串。例如,$encrypt_message = encrypt("Login"); echo decrypt($encrypt_message);

标签: php string encryption


【解决方案1】:

找到 ;)

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

查看http://php.net/manual/fr/function.rawurlencode.php 以根据您的 base64 加密数据制作正确的 URL

如果您无法在 URL 到达 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'

所以,对我来说它工作正常......

【讨论】:

  • 我用这个:$string123 = mysql_escape_string($_GET["st"]);echo encrypt($string123)." - ".decrypt($string123);当我尝试解密Login时输出是这样的@已经加密:3RrkEHf2uUCHszJz68+PLQ== -解密部分是空白的,为什么会这样?还有你用的是什么版本的PHP?
  • 你明白你试图解密你未加密的 var 吗? <_>"
  • 不要使用 f*********** mysql_ plz;不需要,没用(在红框处拿a look
  • 我的意思不是当我做echo decrypt("xeJuD3+A0Po="); 时它会显示一个空白字符串,但没有任何显示,但如果我做任何其他字符串,它们就可以工作......
  • 这是什么打印你:echo "'".decrypt('xeJuD3+A0Po=')."'&lt;br&gt;\n";
猜你喜欢
  • 1970-01-01
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 1970-01-01
  • 2012-07-01
  • 2018-08-26
相关资源
最近更新 更多