PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 2024 → Cryter et décrypter des informations sur des plateformes différentes
Cryter et décrypter des informations sur des plateformes différentes
Started by jmdelhalle, Apr., 19 2018 7:14 AM - 22 replies
Registered member
11 messages
Posted on April, 19 2018 - 7:14 AM
Bonjour,
Notre association développe en WD23 une plateforme de télétravail pour personnes handicapées.
L'application est installée sur des pc sous Windows et les données, stockées et exploitées sur un serveur web distant avec le couple PHP/mySQL.

Problème, il est impossible de crypter et de décrypter des informations sensibles car le moteur PHP ne possède aucune fonction de cryptage compatible avec WD23. Comment faire pour que l'on puisse crypter et décrypter les informations à partir
des deux plateformes (Web et PC) ?
Registered member
2,571 messages
Popularité : +222 (260 votes)
Posted on April, 19 2018 - 8:13 AM
Bonjour,

Il est possible de chiffrer et déchiffrer des informations entre ces différentes plateformes en utilisant les fonctions CrypteStandard et DécrypteStandard.

--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Registered member
11 messages
Posted on April, 19 2018 - 10:18 AM
Bonjour,
J'ai essayé cette piste :
Pour un simple stockage d'informations dans la base de données sql distante et la récupération des données par l'application windev, pas de problème. Seulement, il faut aussi que les informations cryptées puissent être décryptées et exploitées par une apllication en php sur le serveur Web et là cela coince car rien n'est compatible et cela donne des résultats différents.
Registered member
2,571 messages
Popularité : +222 (260 votes)
Posted on April, 19 2018 - 11:09 AM
Perso j'arrive à chiffrer depuis une application Windows et déchiffrer à partir d'une application Android. C'est donc que cela fonctionne.


Quel est le code saisi en php ?

--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Registered member
11 messages
Posted on April, 20 2018 - 3:45 PM
Bonjour,
PCSOFT vient de m'envoyer ce message :
Il n'existe malheureusement pas d'algorithme de cryptage commun entre WINDEV et le moteur PHP. Une suggestion en ce sens a été transmise à notre équipe Développement et notre équipe Qualité pour les prochaines versions.

La solution dans ce cas est d’utiliser un WebService réalisé en WINDEV ou WEBDEV qui pourra s’occuper du décryptage.

Là cela se complique car je n'ai aucune idée pour créer un tel service Web
Registered member
17 messages
Popularité : +1 (1 vote)
Posted on April, 23 2018 - 1:41 PM
Bonjour,

Nous avons développé des modules d'échange de données cryptées entre WD et PHP via CrypteStandart, ... du coté de WD, et openssl_encrypt, ... du coté de php.
C'est pas vraiment documenté, ni du coté de php, ni du coté de PCSoft, mais avec les recherches sur internet on a fini par y arriver.

Bon courage.
Registered member
1,298 messages
Popularité : +20 (72 votes)
Posted on April, 23 2018 - 2:51 PM
Personnellement j'ai du creer ma propre procedure de cryptage

--
Bertin CARRIERE - SPRL RGPD.Zen-Project.be
bertin.carriere@gmail.com
http://www.zen-project.be http://www.linkedin.com/in/bertincarriere

Belgique +32(0)2/318.02.67
France +33(0)3/66.722.542
Espagne +34.5/12.702.266

http://www.be-dev.be
Registered member
2,571 messages
Popularité : +222 (260 votes)
Posted on April, 24 2018 - 10:21 AM
Ce que je trouve dommage, c'est que Windev ne soit toujours pas sur les standards de cryptographie. Il est pourtant bien indiqué dans la documentation que cela est compatible avec tous les autres langages:
Contrairement aux fonctions Crypte et Décrypte, les fonctions CrypteStandard et DécrypteStandard utilisent des algorithmes de cryptage standard qui permettent d’échanger des messages cryptés entre des plateformes d’exécution différentes (Windows, Linux, Android, Java, iOS, PHP, etc.) et/ou avec des outils tiers.


Pourquoi ne pas faire comme tous les autres langages pour une fois et avoir la possibilité d'utiliser ces méthodes inter-plateformes. Le RGPD est pour le 25 mai 2018, et une grande partie des données devront être chiffrées. Si en Windev on ne peut pas déchiffrer ce qui a été chiffré par une autre plateforme on risque d'avoir des soucis d'échange avec d'autres logiciels tiers.

--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Registered member
17 messages
Popularité : +1 (1 vote)
Posted on April, 24 2018 - 11:29 AM
Bonjour,

Ce qui m'étonne c'est la réponse du ST ...
Avec CrypteStandard, DecrypteStandard, et les fonctions PHP openssl_, ça semble bien fonctionner.
Registered member
2,571 messages
Popularité : +222 (260 votes)
Posted on April, 24 2018 - 12:03 PM
As tu un exemple de code à fournir pour aider notre ami et potentiellement d'autres développeurs qui rencontreraient le même problème ?

--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Registered member
11 messages
Posted on April, 24 2018 - 2:17 PM
Bonjour à tous
C'est vrai que je patauge avec les fonctions de cryptages et les exemples donnés dans l'aide ou sur le site de PCSOFT n'aident pas beaucoup.
Pour développer notre Plateforme de télétravail, les organismes partenaires nous en demandent beaucoup et la sécurité vient en premier plan dans la longue listes des choses à faire. Nous sommes tous des bénévoles qui prenons énormément sur notre temps libre, au détriment parfois de notre vie de famille, et nous n'avons pas les mêmes moyens qu'une entreprise. Mais si nous le faisons pas, qui donc s'occupera des personnes handicapées à notre place ? Aussi, si vous avez des pistes, pensez à nous, pensez à eux.
Registered member
17 messages
Popularité : +1 (1 vote)
Posted on April, 24 2018 - 3:07 PM
Bonjour,

En espérant que ce qui suit pourra vous aider, quelques lignes de code pour cryptage en PHP et décryptage en WD :

En PHP :
Initialisation de la clé : $sKey
Initialisation du vecteur : $sVecteur
Cryptage du texte avec :
$sTexteCrypte = openssl_encrypt($sTexte, "AES-128-CBC", $sKey, 0, $sVecteur);

En WinDev:
Initialisation de la clé : bufKey
Initialisation du vecteur : sVecteur

C'est à cet endroit que ça se complique et que la documentation fait défaut :
bufTexteCrypte = sVecteur + Décode(sTexteCrypté)
bufTexteNonCrypte = DécrypteStandard(bufTexteCrypte, bufKey, crypteAES128)

La mise en place par PCSoft d'une fonction vraiment multi-plateformes serait en effet la bienvenue.
Le code ci-dessus fonctionne, mais il a demandé un bon temps de recherche ...
Il faudra que je teste avec un cryptage plus élevé.
Message modified, April, 24 2018 - 3:09 PM
Registered member
940 messages
Popularité : +66 (68 votes)
Posted on April, 24 2018 - 4:42 PM
Bonjour,

je viens rajouter une petite 'briquette' à l'édifice.

Il y a un exemple de code sympa dans la doc PHP de opensll_encrypt() => http://php.net/manual/fr/function.openssl-encrypt.php
( posté par omidbahrami1990 at gmail dot com )

Donc le principe, c'est d'utiliser le cryptage AES256 CBC avec une clé 256 bits , de calculer un Hash du résultat en SHA512 ( ou SHA3-512 si vous le possédé ) avec une clé 512 Bits , et d’intercaler ce Hash entre le vecteur et la valeur crypté.
Puis d'encoder le tout en Base64.

Code PHP :
---------------
// Génère une clé 256 pour le cryptage AES256 ( 32 octets * 8 => 256 bits )
echo base64_encode(openssl_random_pseudo_bytes(32));

// Génère une clé 512 pour le cryptage AES256 ( 64 octets * 8 => 256 bits )
echo base64_encode(openssl_random_pseudo_bytes(64));


Puis stocker ces valeurs dans votre code Windev et vos fichier de config PHP.

// A sauvegarder dans votre fichier de config ( ce sont des exemples )
define('CLE_256BITS','Lk5Uz3slx3BrAghS1aaW5AYgWZRV0tIX5eI0yPchFz4=');
define('CLE_512BITS','EZ44mFi3TlAey1b2w4Y7lVDuqO+SRxGXsa7nctnr/JmMrA2vN6EJhrvdVZbxaQs5jpSe34X3ejFK/o9+Y5c83w==');


Fonctions PHP :
-------------------
// La fonction openssl_cipher_iv_length($method); retourne la taille du vecteur ( pour notre cas AES256 le vecteur fait 128Bit soit 16 octets )
// La fonction openssl_random_pseudo_bytes($iv_length); permet de remplir le vecteur de données aléatoires

// La fonction secured_encrypt() attend le texte à crypter en paramètre.
// La fonction secured_decrypt() attend le texte crypté encodé en Base64 en paramètre

function secured_encrypt($data)
{
$cle_aes256 = base64_decode(CLE_256BITS);
$cle_hash512 = base64_decode(CLE_512BITS);

$method = "aes-256-cbc";
$iv_length = openssl_cipher_iv_length($method);
$iv = openssl_random_pseudo_bytes($iv_length);

$first_encrypted = openssl_encrypt($data,$method,$cle_aes256 , OPENSSL_RAW_DATA ,$iv);
$second_encrypted = hash_hmac('sha3-512', $first_encrypted , $cle_hash512 , TRUE);

$output = base64_encode($iv.$second_encrypted.$first_encrypted);
return $output;
}

function secured_decrypt($input)
{
$cle_aes256 = base64_decode(CLE_256BITS);
$cle_hash512 = base64_decode(CLE_512BITS);
$mix = base64_decode($input);

$method = "aes-256-cbc";
$iv_length = openssl_cipher_iv_length($method);

$iv = substr($mix,0,$iv_length);
$second_encrypted = substr($mix,$iv_length,64);
$first_encrypted = substr($mix,$iv_length+64);

$data = openssl_decrypt($first_encrypted,$method,$cle_aes256 ,OPENSSL_RAW_DATA,$iv);
$second_encrypted_new = hash_hmac('sha3-512', $first_encrypted, $cle_hash512 , TRUE);

if (hash_equals($second_encrypted,$second_encrypted_new))
return $data;

return false;
}
Registered member
940 messages
Popularité : +66 (68 votes)
Posted on April, 24 2018 - 4:49 PM
Vous pouvez remplacer dans les deux fonctions :
hash_hmac('sha3-512',....

par
hash_hmac('sha512',....

si vous le souhaitez.
Registered member
940 messages
Popularité : +66 (68 votes)
Posted on April, 24 2018 - 5:08 PM
Pour la partie Windev, mon collègue m'a piqué ma clé 23 ^^ donc çà va être en impro sans tests....

Il faut donc reprendre les mêmes clés 256 et 512 bits que vous aurez stocké et généré en PHP.

// Clés stockées en Base64
CONSTANT
CLE_256BITS = "Lk5Uz3slx3BrAghS1aaW5AYgWZRV0tIX5eI0yPchFz4="
CLE_512BITS = "EZ44mFi3TlAey1b2w4Y7lVDuqO+SRxGXsa7nctnr/JmMrA2vN6EJhrvdVZbxaQs5jpSe34X3ejFK/o9+Y5c83w=="
FIN


Procedure secured_encrypt(vp_text) : chaîne

PRIVÉ
_result est une chaîne=""

_buff_cle_aes256 est un buffer=Decode(cle_256BITS,encodeBASE64)
_buff_text est un buffer=vp_text
_buff_crypt est un buffer=CrypteStandard(_buff_text,_buff_cle_aes256,crypteAES256,crypteCBC)

_buff_hash est un buffer=HashChaîne(HA_SHA3_512,_buff_crypt) // ou bien HA_SHA_512 , reprendre le même que celui utilisé en PHP

_result=Encode(_buff_crypt[[1 sur 16]]+_buff_hash+_buff_crypt[[17 a]],encodeBASE64)

RENVOYER _result


à tester voir ce que çà donne.
Registered member
940 messages
Popularité : +66 (68 votes)
Posted on April, 24 2018 - 5:10 PM
si çà ne fonctionne pas , j’essaierai de faire des tests dès que je récup ma clé.

Bon dèv ;)
Registered member
11 messages
Posted on April, 24 2018 - 6:44 PM
Bonsoir,
Merci à vous tous pour votre aide.
J'ai testé le code de Christophe :
- Côté php, cela roule
- Côté Windev, c'est plus dur, les chaînes cryptées donnent des résultat différents si on essaye de les décrypter sous php
Pour le décryptage sous Windev, faut-il procéder comme au cryptage ?
Registered member
1,298 messages
Popularité : +20 (72 votes)
Posted on April, 25 2018 - 9:38 AM
Un exemple de cryptage, bien sur on peut complexifier


// Résumé : <indiquez ici ce que fait la procédure>
// Syntaxe :
//[ <Résultat> = ] ChaineDecrypte ( [<sChaine> est chaîne [, <sCLE> est chaîne [, <bPourCrypter> est booléen]]])
//
// Paramètres :
// sChaine (chaîne ANSI - valeur par défaut="") : <indiquez ici le rôle de sChaine>
// sCLE (chaîne ANSI - valeur par défaut="") : <indiquez ici le rôle de sCLE>
// bPOurCrypter (booléen - valeur par défaut=1) : <indiquez ici le rôle de bPOurCrypter>
// Valeur de retour :
// chaîne ANSI : // Aucune
//
// Exemple :
// Indiquez ici un exemple d'utilisation.
//
Procedure ChaineDecrypte(sChaine est une chaîne ANSI = "",sCLE est une chaîne ANSI = "",bPOurCrypter est un booléen = Vrai)

Machaine est une chaîne ANSI = sChaine
sRenvoyer est une chaîne ANSI
sCaract est une chaîne ANSI
tabDecallage est un tableau d'entier
nCaract est un entier
nPos est un entier

SI bPOurCrypter = Faux ALORS
Machaine = Décrypte(Machaine,"",crypteAucun,encodeBASE64)
FIN


SI sChaine = "" ALORS
RENVOYER sRenvoyer
SINON
SI sCLE = "" ALORS
sCLE = "Cl3_ParD3f@ut"
FIN

// Indice de décallage dans la table ascii
POUR i = 1 _A_ Taille(sCLE)
TableauAjoute(tabDecallage,0)

tabDecallage[i] = Asc(Milieu(sCLE,i,1))
SI EnModeTest() = Vrai ALORS
Trace(" Decallage : "+Milieu(sCLE,i,1)+" --> "+tabDecallage[i])
FIN
FIN


POUR j = 1 _A_ Taille(Machaine)


nPos ++


SI nPos > Taille(sCLE) ALORS
nPos = 1
FIN
sCaract = Milieu(Machaine,j,1)
nCaract = Asc(Milieu(sCaract,1,1))

SI nCaract > 32 _ET_ nCaract < 126 ALORS

SI EnModeTest() = Vrai ALORS
Trace("Crypte : "+nCaract)
FIN
SI (EstPair(j) _ET_ bPOurCrypter = Vrai) _OU_ (EstImpair(j) _ET_ bPOurCrypter = Faux) ALORS
nCaract = nCaract + Val (tabDecallage[nPos])
SINON
nCaract = nCaract - Val (tabDecallage[nPos])
FIN


TANTQUE nCaract > 125 OU nCaract < 33

SI nCaract > 125 ALORS
nCaract = 32 + (nCaract - 125)
SINON
SI nCaract < 33 ALORS
nCaract = 126 - (33-nCaract)
FIN
FIN
FIN

sCaract = Caract(nCaract)
SINON

FIN
sRenvoyer += sCaract
FIN
FIN


SI bPOurCrypter = Vrai ALORS
sRenvoyer = Crypte(sRenvoyer,"",crypteAucun,encodeBASE64)
FIN




RENVOYER sRenvoyer


--
Bertin CARRIERE - SPRL RGPD.Zen-Project.be
bertin.carriere@gmail.com
http://www.zen-project.be http://www.linkedin.com/in/bertincarriere

Belgique +32(0)2/318.02.67
France +33(0)3/66.722.542
Espagne +34.5/12.702.266

http://www.be-dev.be
Registered member
11 messages
Posted on April, 25 2018 - 3:47 PM
Bonjour,
Un grand merci pour votre code, c'est une bonne base de départ.
En testant le code de Christophe, j'ai remarqué que les résultats étaient différents selon Windev22 ou Windev23. Encore un mystère.
De plus, Windows 10 n'arrange pas les choses avec ses mises à jours en tâche de fond...
Registered member
940 messages
Popularité : +66 (68 votes)
Posted on April, 25 2018 - 5:57 PM
me revoilà !!!

désolé

pas eu bcp de temps

donc j'avais commis quelques boulettes sur mon code windev
mauvais Hachage ( il faut prendre le HA_HMAC_SHA_512 c'est la version avec mot de passe et non pas H_SHA_512 )
mauvais hachage, je hachais le vecteur et les données

bon bref plein d'autre bug !! lol

j'ai testé ceci qui fonctionne chez moi.
en AES256 CBC et SHA512

voici les deux méthodes Windev :

Procedure secured_encrypt(vp_text) : chaîne

PRIVÉ
_result est une chaîne=""

_buff_cle_aes128 est un Buffer sur 16=Decode(CLE_128BITS,encodeBASE64)
_buff_cle_aes256 est un Buffer sur 32=Decode(CLE_256BITS,encodeBASE64)
_buff_cle_hash512 est un Buffer sur 64=Decode(CLE_512BITS,encodeBASE64)
_buff_text est un Buffer=ChaîneVersUTF8(vp_text)
_buff_crypt est un Buffer=CrypteStandard(_buff_text,_buff_cle_aes256,crypteAES256,crypteCBC)
_buff_result est un Buffer
_buff_hash est un Buffer sur 64=HashChaîne(HA_HMAC_SHA_512,_buff_crypt[[17 À]],_buff_cle_hash512) // ou bien HA_SHA_512 , reprendre le même que celui utilisé en PHP

SI EnModeTest() ALORS
Trace("Vecteur : "+Remplace(Encode(_buff_crypt[[À 16]],encodeBASE64),RC,""))
Trace("Hash : "+Remplace(Encode(_buff_hash,encodeBASE64),RC,""))
Trace("Data : "+Remplace(Encode(_buff_crypt[[17 À]],encodeBASE64),RC,""))
FIN

_buff_result=_buff_crypt[[À 16]]
_buff_result+=_buff_hash
_buff_result+=_buff_crypt[[17 À]]
_result=Remplace(Encode(_buff_result,encodeBASE64),RC,"")

RENVOYER _result


Procedure secured_decrypt(vp_text_base64) : chaîne

PRIVÉ
_buff_cle_aes128 est un Buffer sur 16=Decode(CLE_128BITS,encodeBASE64)
_buff_cle_aes256 est un Buffer sur 32=Decode(CLE_256BITS,encodeBASE64)
_buff_cle_hash512 est un Buffer sur 64=Decode(CLE_512BITS,encodeBASE64)

_buff_global est un Buffer=Decode(vp_text_base64,encodeBASE64)
_buff_vecteur est un Buffer sur 16=_buff_global[[ À 16]]
_buff_data est un Buffer=_buff_global[[81 À]]
_buff_hash est un Buffer sur 64=_buff_global[[17 SUR 64]]
_buff_decrypt est un Buffer=DécrypteStandard(_buff_vecteur+_buff_data,_buff_cle_aes256,crypteAES256,crypteCBC)

_buff_hash_calcule est un Buffer sur 64=HashChaîne(HA_HMAC_SHA_512,_buff_data,_buff_cle_hash512) // ou bien HA_SHA_512 , reprendre le même que celui utilisé en PHP

SI EnModeTest() ALORS
Trace("Vecteur : "+Remplace(Encode(_buff_global[[À 16]],encodeBASE64),RC,""))
Trace("Hash calculé : "+Remplace(Encode(_buff_hash,encodeBASE64),RC,""))
Trace("Hash originel : "+Remplace(Encode(_buff_global[[17 SUR 64]],encodeBASE64),RC,""))
Trace("Data : "+Remplace(Encode(_buff_global[[81 À]],encodeBASE64),RC,""))
FIN

SI _buff_hash=_buff_hash_calcule ALORS
RENVOYER UTF8VersChaîne(_buff_decrypt)
SINON
RENVOYER Null
FIN
Registered member
940 messages
Popularité : +66 (68 votes)
Posted on April, 25 2018 - 6:02 PM
Théoriquement avec çà, niveau sécurité vous devriez être pas mal, çà mélange du hachage et du cryptage.

a tester chez vous sur votre plateforme php, mais chez moi ( j'utilise Wamp ) , çà fonctionne. ( en php 5.6.31 )


bon dèv ;)
Registered member
940 messages
Popularité : +66 (68 votes)
Posted on April, 25 2018 - 6:06 PM
j'oubliais,
j'ai juste rajouté l'encodage UTF8 en windev et PHP du coup côté PHP çà donne :

function secured_encrypt($data_brut)
{
$data = utf8_encode($data_brut);
$first_key = base64_decode(FIRSTKEY);
$second_key = base64_decode(SECONDKEY);

$method = "aes-256-cbc";
$iv_length = openssl_cipher_iv_length($method);
$iv = openssl_random_pseudo_bytes($iv_length);

$first_encrypted = openssl_encrypt($data,$method,$first_key,OPENSSL_RAW_DATA,$iv);
$second_encrypted = hash_hmac('sha512', $first_encrypted, $second_key, TRUE);

$output = base64_encode($iv.$second_encrypted.$first_encrypted);

return $output;
}

function secured_decrypt($input)
{
$first_key = base64_decode(FIRSTKEY);
$second_key = base64_decode(SECONDKEY);
$mix = base64_decode($input);

$method = "aes-256-cbc";
$iv_length = openssl_cipher_iv_length($method);

$iv = substr($mix,0,$iv_length);
$second_encrypted = substr($mix,$iv_length,64);
$first_encrypted = substr($mix,$iv_length+64);

$data = openssl_decrypt($first_encrypted,$method,$first_key,OPENSSL_RAW_DATA,$iv);
$second_encrypted_new = hash_hmac('sha512', $first_encrypted, $second_key, TRUE);

if (hash_equals($second_encrypted,$second_encrypted_new))
return utf8_decode($data);

return false;
}
Registered member
11 messages
Posted on April, 26 2018 - 6:47 AM
Merci à Christophe et à Bertin
Avec tous ces éléments nous allons pouvoir avancer
Je tarde parfois à répondre mais je me trouve sur la ligne la plus perturbée par les gréves (déjà qu'en temps normal c'est pas la joie) et on galère pour se rendre et revenir du boulot... En tous cas, merci à vous deux.