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
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 –
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. –
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é –