2015-11-15 3 views
1

У меня есть функция для шифрования и дешифрования строки с помощью соли/пароля, но есть проблема, у меня нет проблем с шифрованием любой строки, но с decrpyting у нее есть проблема с расшифровкой некоторых строк. .Некоторые строки не будут расшифровываться

Например, он будет расшифровывать «Hello World», но не «Логин» или «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 

Если кто-то может указать на вопрос или помощь, пожалуйста, дайте мне знать, спасибо!

Вот мой код:

USE - "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); 
} 
?> 
+0

'echo decrypt ();'? Откуда стоит ''? Это должен быть зашифрованный текст, который вы получили от 'encrypt' –

+0

@ArtjomB. Я помещал это как местозаполнитель, но это то, где строка идет. – TymeBomb

+2

'mysql_escape_string' => WTF ô_O ??? – Blag

ответ

1

Найдено;)

В вашем URL, используйте http://example.com/test.php?st=xeJuD3%2BA0Po%3D в =+ и другой символ не имеет ту использоваться в URL.

Посмотрите на http://php.net/manual/fr/function.rawurlencode.php изготовить правильный URL из ваших base64 зашифрованные данные

Если вы не можете изменить URL, прежде чем он ударил PHP, вам придется изменить обратно пространство в +:

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

И BTW, удалите $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' 

Таким образом, для меня это отлично работает .. .

+0

Я использовал это:. '$ string123 = mysql_escape_string ($ _ GET [ "е"]);' ' эхо шифровать ($ string123) "-" .decrypt ($ string123);' И это результат, когда я пытаюсь дешифровать «Логин», который уже был обработан: «3RrkEHf2uUCHszJz68 + PLQ == - расшифрованная часть пуста, почему? Также какую версию PHP вы используете? – TymeBomb

+0

вы понимаете, что пытаетесь расшифровать свой незашифрованный var? <_> « – Blag

+0

Не используйте f ***********' mysql_' plz, вам это не нужно, это бесполезно (и возьмите [взгляд] (http://php.net/) manual/en/function.mysql-escape-string.php) в красном поле) – Blag

Смежные вопросы