Некоторые строки не расшифровываются

1

У меня есть функция для шифрования и дешифрования строки с помощью соли/пароля, но есть проблема, у меня нет проблем с шифрованием любой строки, но с 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);
}
?>
  • 0
    echo decrypt(<STRING>); ? Откуда появился <STRING> ? Это должен быть зашифрованный текст, полученный при encrypt
  • 0
    @ArtjomB. Я поместил это как заполнитель, но это то место, куда идет строка.
Показать ещё 13 комментариев
Теги:
string
encryption

1 ответ

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["st"]); echo encrypt($string123)." - ".decrypt($string123); И вывод такой, когда я уже пытаюсь расшифровать Login Encypted: 3RrkEHf2uUCHszJz68+PLQ== - дешифрованная часть 3RrkEHf2uUCHszJz68+PLQ== - , почему это так? Кроме того, какую версию PHP вы используете?
  • 0
    ты понимаешь, что пытаешься расшифровать свой незашифрованный var? <_>»
Показать ещё 13 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню