2017-01-04 8 views
0

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

Тот же незашифрованный ключ зашифрован на веб-сайте продавца, но w Ith другой 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" 

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

+2

Значит, длина строки 39 байт и длина строки 35 байт идентичны ??? Я предполагаю, что нулевые байты для заполнения –

+0

Как вы можете видеть на дампах var, строки не равны. В первой строке должны быть скрытые символы. Кроме того, вам не нужно повторять дамп var. Достаточно только вызывать var_dump(). Нам нужна дополнительная информация о вашей функции дешифрования, чтобы получить дополнительную информацию о скрытых символах. –

+0

Я знаю, что длина не идентична, но они одинаковы в строках, как я могу сделать их идентичными, поскольку они являются одним и тем же значением. Я использовал –

ответ

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); 
+0

Я понял, что вы имеете в виду. Большое спасибо за вашу помощь –