2017-01-04 1 views
0

J'ai 2 tables une table marchande et une table de commande. chaque table a une clé secrète que j'utilise pour comparer pour vérifier la sécurité. Les deux sont cryptés. Je les décrypte pour les valider. Le problème est après le déchiffrement que j'obtiens la même valeur de chaîne mais les comparant retourne faux. Voici le codecomparer des chaînes identiques retourne false

CE NUMÉRO T-IL SI STRING A CARACTÈRES SPÉCIAUX ET NE PASSERA SI STRING A LETTRES ET CHIFFRES SEULEMENT

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); 
} 

Sauver le marchand clé

$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 

Pour déchiffrer

La même clé non chiffrée est cryptée sur le site marchand, vec une autre 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 

Le résultat est:

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

Puis:

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

var_dump(trim($decrypted_key)); 
var_dump(trim($order_decrypted_key)); 
chaîne

(78)

"326431643534727435683474683572683574723168252426616d703b5e2f2b3d67646764666764" 
chaîne

(70)

"3264316435347274356834746835726835747231682524265e2f2b3d67646764666764" 

Alors, comment résoudre ce problème et vérifier si elles sont égales ou non

+2

Donc une longueur de chaîne de 39 octets et une longueur de chaîne de 35 octets sont identiques ??? Je suppose que les octets nuls pour le remplissage –

+0

Comme vous pouvez le voir sur les dumps var, les chaînes ne sont pas égales. Vous devriez avoir des caractères cachés dans la première chaîne. En outre, vous n'avez pas besoin d'écho à la vidage de var. Appeler seulement var_dump() est suffisant. Nous avons besoin de plus de détails sur votre fonction de décryptage pour plus de détails sur les caractères cachés. –

+0

Je sais longueur n'est pas identique mais ils sont identiques dans les chaînes comment puis-je les rendre identiques car ils sont la même valeur que j'ai utilisé –

Répondre

1

Vos deux chaînes ne sont pas les mêmes, que tout le monde réuni. Et il n'y a pas de rembourrage mystère j'ai peur.

Votre chaîne la plus longue est 2d1d54rt5h4th5rh5tr1h%$&^/+=gdgdfgd (remarquez l'htmlentity au milieu, représentant les 4 caractères supplémentaires).

(Trouvé en exécutant les opérations suivantes sur vos données non emballés):

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

Réponse:

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

Je ne peux que deviner que vous imprimez votre comparaison sur le web au lieu que sur le terminal, et que vous présentez le résultat tel que rendu par le navigateur (et non le résultat réel), ne voyant pas ces quatre caractères supplémentaires. Avant d'enregistrer vos données, vous devez probablement exécuter quelque chose pour décoder les entités html dans votre entrée. Ou vous pourriez le faire avant de comparer, mais beaucoup mieux pour enregistrer les données correctement.

$decrypted_key  = htmlspecialchars_decode($decrypted_key); 
$order_decrypted_key = htmlspecialchars_decode($order_decrypted_key); 
+0

Ya-je compris ce que vous voulez dire. Merci beaucoup pour votre aide –