PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → crypteStandart et openssl php >= 7
crypteStandart et openssl php >= 7
Débuté par The beginner, 14 juil. 2019 17:25 - 4 réponses
Membre enregistré
5 messages
Posté le 14 juillet 2019 - 17:25
Bonjour a tous,
Je suis coincé avec la fonction crypteStandard et avec une api qui décrypte avec openssl_decrypt

coté Windev dans l'expression la plus simple:
"{ "compteID":40 }" // chaine de test
bufConsumer est un Buffer = "6B343EE61E4391F6B3D2D701B5723B0D50A981E085A3B416CF7AD09A8049BF73";
bufValeur est un Buffer = ChaîneVersUTF8(cValeur)
chaineCrypte est un Buffer = CrypteStandard(bufValeur, bufConsumer[[À 32]], crypteAES256,crypteCBC,cryptePaddingZéro)

RENVOYER Encode(chaineCrypte,encodeBASE64)


Coté php toujours dans l’expression la plus simple:
$data = base64_decode($request->get('data'));

    $consumer = '6B343EE61E4391F6B3D2D701B5723B0D50A981E085A3B416CF7AD09A8049BF73';
    $IV = substr($data,0 , $iv_size);
    $data = substr($data, $iv_size);
    $chaine = openssl_decrypt($data,'AES-256-CBC', substr($consumer, 0, 32), OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $IV);


Mon résultat de décodage est plutôt surprenant:
[2019-07-14 16:47:23] local.DEBUG: array (
  'data' => 'DCglypTepxa2cLtbSDWe543072lU6qZ5NRT4WtCYVySO07Kr',
  'IV' => 'KDWuAm20W+SZHV5s',
  'decrypter' => '1����- #.���d�`i�C�N����L\'�����V�P��}G�q
�(',
  'error' => false,
)


j'effectue les mêmes test coté .net avec le même mode cryptage AES-256-CBC et cela fonctionne.
Je pense que coté Windev je dois certainement oublié une conversion de type avant mon appel.

Merci pour votre aide
Membre enregistré
2 571 messages
Popularité : +222 (260 votes)
Posté le 15 juillet 2019 - 08:58
Bonjour,

Il me semble que tu oublies de convertir le buffer "bufConsumer" en utf8.

--
Cordialement,

Philippe SAINT-BERTIN
Membre enregistré
5 messages
Posté le 15 juillet 2019 - 10:19
Bonjour Philippe,

Merci pour ta réponse
La conversion en UTF-8 ne change malheureusement rien.
Membre enregistré
2 571 messages
Popularité : +222 (260 votes)
Posté le 17 juillet 2019 - 08:27
Une chose que je peux dire c'est que encode renvoie des données avec des RC au bout d'un certain nombre de caractères. Es-tu sûr que toute la chaîne est bien passée au php ou qu'il n'ya pas un caractère parasite au milieu de tout ça ?

--
Cordialement,

Philippe SAINT-BERTIN
Membre enregistré
5 messages
Posté le 29 juillet 2019 - 14:45
Bonjour,
je fais un retour final de la mise en place:
Nous utilisons Windev 24 et une api Rest distribué sous laravel avec php 7.2.
Malgré les différentes lectures du même genre de problème de notre coté cela extrêmement simple.
Pas encodage, pas conversion UTF-8.

coté Windev un simple :
Procedure encrypt(cValeur est un Buffer) : Buffer
bufConsumer est un Buffer = "6B343EE61E4391F6B3D2D701B5723B0D50A981E085A3B416CF7AD09A8049BF73"
bufValeur est un Buffer = cValeur
chaineCrypte est un Buffer = CrypteStandard(bufValeur, bufConsumer[[À 32]], crypteAES256,crypteCBC)

RENVOYER chaineCrypte

Procedure getApi(bufData est une Buffer) : chaîne

vContenu est un Variant
vContenu.data = CEndPoint.encrypt(bufData)

Data est un Buffer = VariantVersJSON(vContenu)
serviceUrl est une restRequête
serviceUrl.URL = "http://uri"
serviceUrl.Méthode = httpPost //Toutes les requêtes sont en post
serviceUrl.ContentType = "application/json"
serviceUrl.Contenu = Data

serviceResponse est une restRéponse
serviceResponse = RESTEnvoie(serviceUrl)

SI ErreurDétectée ALORS
Erreur(ErreurInfo(errComplet))
ELSE
RENVOYER serviceResponse.Contenu
FIN

//Test appel
clAgency est un objet Agence
clAgency.name = "Bonjour je suis moi"
clAgency.address = "Je suis ici. \n\rA cette endroit."
test est Buffer
Serialize(clAgency, test, psdJSON)

sRetourEndPoint est une chaîne = clEndpoint.getApi(test)
Désérialise(clAgency, test, psdJSON)

Le retour d'appel n'est pas crypté avec cette exemple.

Coté PHP
$iv_size = openssl_cipher_iv_length('AES-256-CBC');
$data = base64_decode($request->get('data'));
    $consumer = '6B343EE61E4391F6B3D2D701B5723B0D50A981E085A3B416CF7AD09A8049BF73';
    $IV = substr($data,0 , $iv_size);
    $data = substr($data, $iv_size);
    $chaine = openssl_decrypt($data,'AES-256-CBC', substr($consumer, 0, 32), OPENSSL_RAW_DATA, $IV);
return json_decode(rtrim($chaine), true);


L'utilisation du rtrim est la uniquement pour supprimer la série d'octet(s) de fin de chaîne.