У меня есть функция для шифрования и дешифрования строки с помощью соли/пароля, но есть проблема, у меня нет проблем с шифрованием любой строки, но с decrpyting у нее есть проблема с расшифровкой некоторых строк...
Например, он расшифрует "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
Если кто-нибудь может указать на проблему или помощь, пожалуйста, дайте мне знать, спасибо!
ЗДЕСЬ МОЙ КОД:
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);
}
?>
Найденный ;)
В 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'
Итак, для меня это нормально работает...
$string123 = mysql_escape_string($_GET["st"]);
echo encrypt($string123)." - ".decrypt($string123);
И вывод такой, когда я уже пытаюсь расшифровать Login
Encypted: 3RrkEHf2uUCHszJz68+PLQ== -
дешифрованная часть 3RrkEHf2uUCHszJz68+PLQ== -
, почему это так? Кроме того, какую версию PHP вы используете?
echo decrypt(<STRING>);
? Откуда появился<STRING>
? Это должен быть зашифрованный текст, полученный приencrypt