сравнение идентичных строк возвращает false

У меня есть 2 таблицы: торговая таблица и таблица заказов. у каждой таблицы есть секретный ключ, который я использую для сравнения с проверкой безопасности. Оба зашифрованы. Я расшифровываю их для проверки. Проблема в том, что после расшифровки я получаю одно и то же строковое значение, но сравнение их возвращает false. Вот код

ЭТА ПРОБЛЕМА ПРОИСХОДИТ, ЕСЛИ СТРОКА СОДЕРЖИТ СПЕЦИАЛЬНЫЕ СИМВОЛЫ, И НЕ ВОЗНИКАЕТ, ЕСЛИ СТРОКА СОДЕРЖИТ ТОЛЬКО БУКВЫ И ЦИФРЫ

public function merchant_encrypt($pure_string, $encryption_key) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $encrypted_string = mcrypt_encrypt(MCRYPT_BLOWFISH, $encryption_key, utf8_encode($pure_string), MCRYPT_MODE_ECB, $iv);
    return $encrypted_string;
}

public function merchant_decrypt($encrypted_string, $encryption_key) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $decrypted_string = mcrypt_decrypt(MCRYPT_BLOWFISH, $encryption_key, $encrypted_string, MCRYPT_MODE_ECB, $iv);
    return $decrypted_string;
}

public function replace_spechial_charater($value){
    $value = str_replace('+=','plusequal',$value);
    $value = str_replace('=','equalsign',$value);
    $value = str_replace('+','plussign',$value);
    $value = str_replace('/','slashsign',$value);
    $value = str_replace('&','andsign',$value);
    return $value;
}

public function restore_spechial_charater($value){
    $value = str_replace('plusequal','+=',$value);
    $value = str_replace('equalsign','=',$value);
    $value = str_replace('plussign','+',$value);
    $value = str_replace('slashsign','/',$value);
    $value = str_replace('andsign','&',$value);
    return $value;
}

public function strhex($string) { 
    $hexstr = unpack('H*', $string); 
    return array_shift($hexstr); 
}

Сохранение ключа продавца

$enc_key = $row['merchant_id'];
$merchant_key = trim($_POST['key']); //e.g: 1234abcd+=&$
$merchant_key = replace_spechial_charater($merchant_key);
$encrypted_key = merchant_encrypt($merchant_key ,$enc_key);
$encrypted_key = base64_encode($encrypted_key);
//save $encrypted_key in the merchant table

Чтобы расшифровать это

$decrypted_key = base64_decode($row['key']);
$decrypted_key = decrypt($decrypted_key,$row['merchant_id']);
$decrypted_key = restore_spechial_charater($decrypted_key);
// the result is 2d1d54rt5h4th5rh5tr1h%$&^/+=gdgdfgd

Тот же незашифрованный ключ зашифрован на веб-сайте продавца, но с другим ключом enc_key.

$enc_key = $row['order_id'];
$merchant_key = $row['key']; // 1234abcd+=&$
$merchant_key = replace_spechial_charater($merchant_key);
$encrypted_key = merchant_encrypt($merchant_key ,$enc_key);
$encrypted_key = base64_encode($encrypted_key);
//send $encrypted_key with other parameters to the payment gateway then returned to the php script

$order_decrypted_key = base64_decode($row['order_id']);
$order_decrypted_key = decrypt($order_decrypted_key ,$row['order_id']);
$order_decrypted_key = restore_spechial_charater($order_decrypted_key );
// the result is 2d1d54rt5h4th5rh5tr1h%$&^/+=gdgdfgd

var_dump(strip_tags($decrypted_key));
var_dump(strip_tags($order_decrypted_key));
$result = strcasecmp( trim($decrypted_key), trim($order_decrypted_key) );
echo $result;
//var_dump(trim()) returns the same result for both values

Результат:

string(39) "2d1d54rt5h4th5rh5tr1h%$&^/+=gdgdfgd" 
string(35) "2d1d54rt5h4th5rh5tr1h%$&^/+=gdgdfgd" 
3

Затем:

$order_key = strhex($order_decrypted_key);
$merchant_key = strhex($decrypted_key);

var_dump(trim($decrypted_key));
var_dump(trim($order_decrypted_key));

строка(78)

"326431643534727435683474683572683574723168252426616d703b5e2f2b3d67646764666764"

строка(70)

"3264316435347274356834746835726835747231682524265e2f2b3d67646764666764"

Итак, как исправить эту проблему и проверить, равны они или нет


person PHP User    schedule 04.01.2017    source источник
comment
Итак, длина строки 39 байт и длина строки 35 байт идентичны??? Я бы предположил, что нулевые байты для заполнения   -  person Mark Baker    schedule 04.01.2017
comment
Как вы можете видеть на дампах переменных, строки не равны. У вас должно быть несколько скрытых символов внутри первой строки. Кроме того, вам не нужно повторять дамп var. Достаточно только вызова var_dump(). Нам нужна дополнительная информация о вашей функции расшифровки, чтобы получить дополнительную информацию о скрытых символах.   -  person Lucas Meine    schedule 04.01.2017
comment
Я знаю, что длина не идентична, но они идентичны в строках, как я могу сделать их идентичными, поскольку они имеют то же значение, которое я использовал   -  person PHP User    schedule 04.01.2017
comment
если бы это были нулевые байты для заполнения, обрезка позаботилась бы о них. не зная больше о том, как были сформированы струны, трудно сказать. В самом худшем случае я бы зациклил эти строки, чтобы увидеть код каждого из символов, чтобы попытаться увидеть, какие непечатаемые символы проходят.   -  person yivi    schedule 04.01.2017
comment
var_dump(trim($yourstrings)) дает вам тот же результат?   -  person yivi    schedule 04.01.2017
comment
@yivi да тот же результат   -  person PHP User    schedule 04.01.2017
comment
@LukasMeine: код обновлен с функцией шифрования   -  person PHP User    schedule 04.01.2017
comment
Из любопытства, почему вы запускаете strip_tags для этого эха?   -  person yivi    schedule 04.01.2017
comment
@yivi: это был ответ на аналогичный вопрос, я пробовал, но не решил свою проблему.   -  person PHP User    schedule 04.01.2017
comment
Используйте function strhex($string) { $hexstr = unpack('H*', $string); return array_shift($hexstr); }, чтобы преобразовать строки в шестнадцатеричные значения ASCII и сопоставить их с отображаемыми символами.   -  person Mark Baker    schedule 04.01.2017
comment
@MarkBaker: код обновлен с помощью функции strhex   -  person PHP User    schedule 04.01.2017


Ответы (1)


Ваши две струны не совпадают, как все поняли. И я боюсь, что нет никакой таинственной прокладки.

Ваша более длинная строка — 2d1d54rt5h4th5rh5tr1h%$&^/+=gdgdfgd (обратите внимание на htmlentity в середине, учитывая 4 дополнительных символа).

(Обнаружено путем запуска следующих распакованных данных):

$string = "326431643534727435683474683572683574723168252426616d703b5e2f2b3d67646764666764";
$packed = pack("H*", $string);
var_dump($packed);

Ответ:

string(39) "2d1d54rt5h4th5rh5tr1h%$&^/+=gdgdfgd"

Я могу только догадываться, что вы печатаете свое сравнение в Интернете, а не на терминале, и что вы представляете результат, отображаемый браузером (а не фактический результат), поэтому не видите эти дополнительные четыре символа.

Перед сохранением ваших данных вам, вероятно, следует запустить что-то для декодирования html-объектов в вашем вводе. Или вы могли бы сделать это перед сравнением, но гораздо лучше правильно сохранить данные.

$decrypted_key       = htmlspecialchars_decode($decrypted_key);
$order_decrypted_key = htmlspecialchars_decode($order_decrypted_key);
person yivi    schedule 04.01.2017