IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Déchiffrement à l'aide d'une clé publique


Sujet :

Langage PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 51
    Par défaut Déchiffrement à l'aide d'une clé publique
    Bonjour
    Je ouhaite securisé sur mon site internet le paiement en ligne.
    Je passe aujourd'hui par l'interface de paybox. Pour m'assurer qu'une personne n'est pas un intru, je dois déchiffrer une phrase à l'aide d'une clé publique fournit par Paybox.

    Mais je ne sais absolument pas comment la déchiffrer. Voici ce que disent les spécifications techniques de paybox:

    1) Récupérer le contenu de la donnée du type “K”,
    2) “URL décodée” cette signature,
    3) Décodée en base 64 le résultat de l’étape précédente,
    4) Décrypter avec la clé publique de PAYBOX le résultat de l’étape précédente,
    5) Calculer une empreinte SHA-1 avec les autres données de la variable « PBX_RETOUR »,
    6) L’empreinte calculée dans l’étape précédente doit être égale au résultat de l’étape 4.
    Et voila ce que j'ai mis comme code, mais qui ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // recuperation de la signature + decodage
    $sign = urldecode($_GET["sig"]);
    // decodée en base 64 le résultat de $sign
    $decode = base64_decode($sign);
     
    //Decrypter avec la clé publique de paybox $decode
    $fp=fopen ("/home/chemin/pubkey","r");
    $pub_key=fread ($fp,8192);
    //openssl_pkey_get_public ($pub_key);
    $t = openssl_public_decrypt ($decode,$finaltext,$pub_key);
    echo "<hr>".$finaltext; fclose($fp);
    Auriez vous une idée? Les spécifications ne sont pas très claire nan? auriez vous déjà effectué ce type de travail?

  2. #2
    Membre Expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Par défaut
    Quand tu dis que ca ne fonctionne pas tu peux etre plus précis? Parce que là tu ne compares pas l'étape 4 avec l'étape 6 donc je suppose que c'est pas le "résultat" l'erreur mais plutot une fonction qui n'existe pas, qui n'affiche rien ou quelquechose de ce style?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 51
    Par défaut
    Effectivement, je viens de voir que je n'avais pas mis tous mon code....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    // recuperation de la signature + decodage
    	$sign = urldecode($_GET["sig"]);
    	echo $sign;
    // decodée en base 64 le résultat de $sign
    	$decode = base64_decode($sign);
    	echo "<hr>".$decode;
    //Decrypter avec la clé publique de paybox $decode
    	$fp=fopen ("/home/placeoje/pubkey","r");
    	$pub_key=fread ($fp,8192);
    	//openssl_pkey_get_public ($pub_key);
    	$t = openssl_public_decrypt ($decode,$finaltext,$pub_key,OPENSSL_PKCS1_PADDING);
    	echo "<hr>".$finaltext;
    	fclose($fp);
     
    // calcul de l'empreinte SHA1 :
    	$val = "montant=".$_GET["montant"]."&auto=".$_GET["auto"]."&ref=".$_GET["ref"]."&trans=".$_GET["trans"];
    	echo "<hr>".sha1($val);
    Valeur récupére dans l'url:
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    montant=1290&auto=XXXXXX&ref=Macommande3&trans=630198477&sig=JcisAF63EEGGYGnHSMdXhQ2oTXUBNnnPUPNiOTgNMW8y7cD9rVrOke7n2GDHsesgtVWGDkg5yPlgihEBAkDXyDTAFUEA%2BkVv5fZM0P2eMr2yIOX2mTQExnm3aj3UGnJ6VwuQRd5PmoE%2F6Yji0FkjbcAAerSEXnCQKkgU8XKR6Ck%3D
    Valeur décodé de $sign en base 64 ($decode):
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    %Ȭ�^·A†`iÇHÇW… ¨Mu6yÏPób98 1o2íÀý*ZΑîçØ`Ç±ë µU†H9Èù`Š@×È4ÀA�‘[ù}“4?gŒ¯lˆ9}¦M1žmÚuœž•Âäw“æ Oúb8´HÛp�*!œ$ ’<\¤z
    Valeur renvoyé par $finaltext
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    ¥NM0tE §’4¸%Éýí¨†Õû”?62Y‡Ð6̵žïZ‘ 쇳¡D@>$¥{Õ|k[.îߺÂõ|Ûº©éóÚËòkç²¹ë6]œj�ƒäa½%äì‰Ô»(ç\á¯Mp¬eV‰dªËú”þÊG)§‚Â;£Ò
    Valeur du SHA1:
    b05060b4f609f3a4928625a0815db91bc83f4c72

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 51
    Par défaut
    Bon, un petit coup de fil au service technique (bravo pour la rapidité)
    et voilà la solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    		// ouverture de la clé publique Paybox
    		$fp = $filedata = $key = FALSE;                         // initialisation variables
    		$fsize =  filesize('/home/placeoje/pubkey');            // taille du fichier
    		$fp = fopen('/home/placeoje/pubkey', 'r' );             // ouverture fichier
    		$filedata = fread( $fp, $fsize );                       // lecture contenu fichier
    		fclose( $fp );                                          // fermeture fichier
    		$key = openssl_pkey_get_public( $filedata );        	// recuperation de la cle publique
     
    		$first = strpos($_SERVER['REQUEST_URI'],'?');			// recherche le ?
    		$qrystr = substr($_SERVER['REQUEST_URI'], $first+1); 					// recupere les variables passées en parametres
    		$pos = strrpos( $qrystr, '&' );							// cherche dernier separateur
    		$data = substr( $qrystr, 0, $pos ); 					// recupere les variables non codées
    		$pos= strpos( $qrystr, '=', $pos ) + 1;                 // cherche debut valeur signature
    		$sig = substr( $qrystr, $pos );                         // et voila la signature
    		$sig = base64_decode( urldecode( $sig ));               // decodage signature
    		$t = openssl_verify( $data, $sig, $key ); 
    // si t=0 => pas autorisé si t=1 autorisé

  5. #5
    Membre confirmé Avatar de fadex
    Inscrit en
    Septembre 2005
    Messages
    223
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Septembre 2005
    Messages : 223
    Par défaut
    merci tu ma sauver

  6. #6
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2
    Par défaut Ne pas utiliser urldecode avec $_GET !
    Bonjour,

    effectivement, le code fourni par PayBox ne peut pas marcher dans tous les environnements : il ne faut pas utiliser un urldecode avec un $_GET :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    // BAD CODE! DO NOT USE!
    $term = urldecode($_GET['sterm']);
    ?>
    http://us3.php.net/manual/en/functio...code.php#48481

    En effet, si "magic quotes" est activé, $_GET urldecode déjà les caractères spéciaux...

    La bonne méthode consiste à utiliser $_SERVER['REQUEST_URI'] et vous êtes sûr de ne pas urldecoder 2 fois vos variables.

    C'est quand même incroyable que le code fourni par des fournisseurs de services e-commerce produise des bugs...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Besoin d'aide pour une Requête SQL ...
    Par Kokito dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/07/2004, 11h56
  2. Aide pour une requete ... "COUNT(*)"
    Par mechantebestiole dans le forum Langage SQL
    Réponses: 13
    Dernier message: 25/05/2004, 16h27
  3. besoin d'aide pour une requête
    Par Damien69 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 31/03/2004, 15h38
  4. Aide sur une requete de sélection
    Par stephdiplo150 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/01/2004, 10h40
  5. Aide sur une fenetre
    Par Ray-j dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 29/11/2002, 08h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo