PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → crypteStandart et openssl php >= 7
crypteStandart et openssl php >= 7
Iniciado por The beginner, 14,jul. 2019 17:25 - 4 respuestas
Miembro registrado
5 mensajes
Publicado el 14,julio 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
Miembro registrado
2.682 mensajes
Publicado el 15,julio 2019 - 08:58
Bonjour,

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

--
Cordialement,

Philippe SAINT-BERTIN
Miembro registrado
5 mensajes
Publicado el 15,julio 2019 - 10:19
Bonjour Philippe,

Merci pour ta réponse
La conversion en UTF-8 ne change malheureusement rien.
Miembro registrado
2.682 mensajes
Publicado el 17,julio 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
Miembro registrado
5 mensajes
Publicado el 29,julio 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.