сравнение идентичных строк возвращает 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"

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

0

Решение

Ваши две строки не совпадают, как все собрались. И я не боюсь загадок.

Ваша длинная строка 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);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]