PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 2024 → Pb cryptage et décryptage entre appli pc et android
Pb cryptage et décryptage entre appli pc et android
Débuté par Julie, 01 déc. 2017 14:01 - 17 réponses
Posté le 01 décembre 2017 - 14:01
Bonjour,
J’ai une application sur tablette android qui synchronise par réplication bidirectionnelle une base utilisateur avec comme champ un login et un mot de passe crypté
J’ai un soucis car je n’arrive pas à décrypter le mot de passe sur la tablette si il a été renseigné sur un pc et vice versa


Voici mon code sur le l’application pc pour crypter le mot de passe :
gbufCle est un Buffer = HashChaîne(HA_MD5_128, "mot de passe")



bufMotPasseSaisi est un Buffer
bufMotPasseCrypte est un Buffer

bufMotPasseSaisi=SAI_MotDePasse
bufMotPasseCrypte=CrypteStandard(bufMotPasseSaisi, gbufCle, crypteAES128)
INTERV_Utilisateur.MotDePasse=bufMotPasseCrypte



Voici mon code sur le l’application android pour crypter le mot de passe :
gbufCle est un Buffer = HashChaîne(HA_MD5_128, "mot de passe")

bufMotPasseSaisi est un Buffer
bufMotPasseCrypte est un Buffer

bufMotPasseSaisi=SAI_MotDePasse
bufMotPasseCrypte=CrypteStandard(bufMotPasseSaisi, gbufCle, crypteAES128)
INTERV_Utilisateur.MotDePasse=bufMotPasseCrypte



Voici mon code sur le l’application android pour décrypter le mot de passe :

bufMotPasseDéCrypté est un Buffer =""
bufMotPasseStocké est un Buffer

bufMotPasseStocké=INTERV_Utilisateur.MotDePasse
bufMotPasseDéCrypté=DécrypteStandard(bufMotPasseStocké,gbufCle,crypteAES128)
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 01 décembre 2017 - 15:07
Bonjour
Votre souci vient probablement du fait que le PC gère les chaines de caractère en ANSI et qu'Android les gère en UNICODE.
Sur Andoid pour crypter votre password, testez
bufMotPasseSaisi = UnicodeVersAnsi(SAI_MotDePasse)


Pour le décryptage, vérifiez qu' INTERV_Utilisateur.MotDePasse est défini comme une chaine ANSI.
Membre enregistré
2 569 messages
Popularité : +222 (260 votes)
Posté le 02 décembre 2017 - 05:42
Bonjour,

C'est en effet un problème de codage de caractères. Mais plutôt que d'utiliser de l'ANSI et de l'unicode, il faut utiliser l'utf8 qui est un standard contrairement à l'unicode.

ce qui donnerait sur Android et PC
gbufCle est un Buffer = HashChaîne(HA_MD5_128, ChaîneVersUTF8("mot de passe"))

bufMotPasseSaisi est un Buffer
bufMotPasseCrypte est un Buffer

bufMotPasseSaisi=ChaîneVersUTF8(SAI_MotDePasse)
bufMotPasseCrypte=CrypteStandard(bufMotPasseSaisi, gbufCle, crypteAES128)
INTERV_Utilisateur.MotDePasse=bufMotPasseCrypte


Pour décrypter
gbufCle est un Buffer = HashChaîne(HA_MD5_128, ChaîneVersUTF8("mot de passe"))
bufMotPasseDéCrypté est un Buffer =""
bufMotPasseStocké est un Buffer

bufMotPasseStocké=INTERV_Utilisateur.MotDePasse
bufMotPasseDéCrypté=UTF8VersChaîne(DécrypteStandard(bufMotPasseStocké,gbufCle,crypteAES128))


--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 02 décembre 2017 - 12:51
Bonjour
@Philippe SB : «il faut utiliser l'utf8 qui est un standard contrairement à l'unicode.»
Si ce que j'ai lu sur wikipedia est exacte (https://fr.wikipedia.org/wiki/Unicode) Unicode est un standard...non ?
Membre enregistré
2 569 messages
Popularité : +222 (260 votes)
Posté le 03 décembre 2017 - 07:14
Bonjour,

@Philippe Pasquali: En effet, unicode est normalisé mais il n'est pas codé de la même manière selon la plateforme, notamment sur windows unicode est sur 2 octets et sur ios 4 octets. Donc je suppose qu'il peut y avoir des erreurs de conversion.

D'ailleurs dans la doc il est bien précisé:
Développement multi-plateforme : Pour manipuler des chaînes de caractères, il est nécessaire d'utiliser le même format sur toutes les plateformes. Il est conseillé d'utiliser des chaînes au format UTF 8 (et de convertir les chaînes Unicode si nécessaire).


Alors du coup moi dans le doute !!! :)

--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Posté le 05 décembre 2017 - 09:18
Merci pour votre aide
La solution de Philippe SB fonctionne tres bien :merci:
Membre enregistré
155 messages
Posté le 14 octobre 2018 - 10:17
Bonjour,

J'ai tenté d'appliquer vos conseils sans succès. Je tente d'échanger des informations entre PC <=> Android
Sur PC, l'appli charger un fichier texte et le crypte (fait avec windev 19). Je prend le fichier et l'intègre dans un projet WM22

Sur Android, je charge le fichier crypté puis le décrypte (fait avec WM22)


Au niveau du code :
Sur l'app W19
gbufCle est un Buffer = HashChaîne(HA_MD5_128, ChaîneVersUTF8("XXXXX"))
monCode est un Buffer
chaineCrypte est un Buffer
monCode=ChaîneVersUTF8(fChargeTexte(SAI_Fichier_Src))
chaineCrypte =Crypte(monCode,gbufCle)
fSauveTexte(SAI_Fichier_Dest + "kdw.gch",chaineCrypte )


Je vérifie avec :
gbufCle est un Buffer = HashChaîne(HA_MD5_128, ChaîneVersUTF8("XXXXX"))
chaineDecrypte est un Buffer =""
chaineCrypte est un Buffer

chaineCrypte =fChargeBuffer(SAI_Fichier_Src_GCH)
chaineDecrypte =UTF8VersChaîne(Décrypte(chaineCrypte , gbufCle))
fSauveBuffer(SAI_Fichier_Dest_Html + "listing.html",chaineDecrypte )


Cela fonctionne.

Depuis
bufSFichierHtmlKey = HashChaîne(HA_MD5_128, ChaîneVersUTF8("Deuchbill6310!+10"))
sMessage=fChargeBuffer(fichierHtmlPath+fichierHtmlName)
gbufCodeHtml=UTF8VersChaîne(Décrypte(sMessage, bufSFichierHtmlKey))

Et la, j'obtient l'erreur "Décryptage impossible. Vérifiez que le mot de passe et le type de cryptage spécifiés correspondant bien à ceux choisis lors du cryptage."

J'ai vérifié, les valeurs par defauts sont les mêmes pour W19 et WM22.

Quelqu'un aurait une idée ?
Membre enregistré
155 messages
Posté le 14 octobre 2018 - 10:17
Bonjour,

J'ai tenté d'appliquer vos conseils sans succès. Je tente d'échanger des informations entre PC <=> Android
Sur PC, l'appli charger un fichier texte et le crypte (fait avec windev 19). Je prend le fichier et l'intègre dans un projet WM22

Sur Android, je charge le fichier crypté puis le décrypte (fait avec WM22)


Au niveau du code :
Sur l'app W19
gbufCle est un Buffer = HashChaîne(HA_MD5_128, ChaîneVersUTF8("XXXXX"))
monCode est un Buffer
chaineCrypte est un Buffer
monCode=ChaîneVersUTF8(fChargeTexte(SAI_Fichier_Src))
chaineCrypte =Crypte(monCode,gbufCle)
fSauveTexte(SAI_Fichier_Dest + "kdw.gch",chaineCrypte )


Je vérifie avec :
gbufCle est un Buffer = HashChaîne(HA_MD5_128, ChaîneVersUTF8("XXXXX"))
chaineDecrypte est un Buffer =""
chaineCrypte est un Buffer

chaineCrypte =fChargeBuffer(SAI_Fichier_Src_GCH)
chaineDecrypte =UTF8VersChaîne(Décrypte(chaineCrypte , gbufCle))
fSauveBuffer(SAI_Fichier_Dest_Html + "listing.html",chaineDecrypte )


Cela fonctionne.

Depuis
bufSFichierHtmlKey = HashChaîne(HA_MD5_128, ChaîneVersUTF8("Deuchbill6310!+10"))
sMessage=fChargeBuffer(fichierHtmlPath+fichierHtmlName)
gbufCodeHtml=UTF8VersChaîne(Décrypte(sMessage, bufSFichierHtmlKey))

Et la, j'obtient l'erreur "Décryptage impossible. Vérifiez que le mot de passe et le type de cryptage spécifiés correspondant bien à ceux choisis lors du cryptage."

J'ai vérifié, les valeurs par defauts sont les mêmes pour W19 et WM22.

Quelqu'un aurait une idée ?
Membre enregistré
191 messages
Popularité : +3 (3 votes)
Posté le 21 novembre 2021 - 15:31
Bonjour,

Post qui date de Mathusalem mais bon j'ai tellement galéré que je passe dire un GROS merci à Philippe SB dont la solution #3 fonctionne pour décrypter sous android un crypte venant d'un pc et vive l'UTF8 !
Membre enregistré
191 messages
Popularité : +3 (3 votes)
Posté le 22 novembre 2021 - 16:38
Re,

Moi pas comprendre ! je pensais avoir la solution avec l'UTF8 mais non en fait }:(

The code en windev :
MonBuffer est un Buffer = ChaîneVersUTF8(NumériqueVersChaîne(MonID))
Trace(BufferVersHexa(MonBuffer))
CléDecryptHashé est un Buffer = HashChaîne(HA_MD5_128,ChaîneVersUTF8("Windev"))
Trace(BufferVersHexa(CléDecryptHashé))
ChaineCrypté est un Buffer = CrypteStandard(MonBuffer,CléDecryptHashé,crypteAES128)
Trace(BufferVersHexa(ChaineCrypté))


Si je lance plusieurs fois le même code avec le même ID a chiffrer... et bien mon dernier trace est différent à chaque fois ;(

32 38 31 34 37 34 39 37 36 37 31 30 36 35 39
68 AE 5A 2F 85 A7 AC 6E 06 AE 35 31 7E 67 56 2B
57 A7 12 D7 C2 2F 9B 9E 4E B5 ED 03 5E 25 E5 A5<\r><\n>D3 1B 04 D4 53 9D 2C 78 08 0C A0 54 2A CE EC 6D
32 38 31 34 37 34 39 37 36 37 31 30 36 35 39
68 AE 5A 2F 85 A7 AC 6E 06 AE 35 31 7E 67 56 2B
7E BD 0A 7A 80 83 AD 07 57 41 43 07 C4 26 41 7B<\r><\n>6F 4F 47 98 FD FF 3E AE 2E 06 5F 55 B4 BF 7D 76
32 38 31 34 37 34 39 37 36 37 31 30 36 35 39
68 AE 5A 2F 85 A7 AC 6E 06 AE 35 31 7E 67 56 2B
B7 41 DA 35 87 1D B7 C1 11 40 59 5D 84 B6 2E 9A<\r><\n>9C 56 7E 5C 6F 81 C6 A9 8E 71 01 A8 32 CE AD 96


Tu m'étonnes que derrière j'arrive pas à déchiffrer pour retourner sur mon ID de départ !

Une idée ?
Membre enregistré
3 333 messages
Popularité : +93 (137 votes)
Posté le 22 novembre 2021 - 18:30
Je rappelle que sous windows l'encodage est ANSI
Sous mobile l'encodage est unicode
Donc il faut mettre toutes les chaînes et buffer en ANSI
Utf8 ne sert que pour l'encodage sur le web
Qui est en réalité un format de fichier texte
Membre enregistré
191 messages
Popularité : +3 (3 votes)
Posté le 22 novembre 2021 - 19:29
Certes mais là tous mes tests sont sur windev, sur la même machine

MonBuffer est un Buffer = ChaîneVersUTF8(NumériqueVersChaîne(MonID))
Trace(BufferVersHexa(MonBuffer))
1er test
32 38 31 34 37 34 39 37 36 37 31 30 36 35 39
2eme test
32 38 31 34 37 34 39 37 36 37 31 30 36 35 39
3eme test
32 38 31 34 37 34 39 37 36 37 31 30 36 35 39
CléDecryptHashé est un Buffer = HashChaîne(HA_MD5_128,ChaîneVersUTF8("Windev"))
Trace(BufferVersHexa(CléDecryptHashé))
1er
68 AE 5A 2F 85 A7 AC 6E 06 AE 35 31 7E 67 56 2B
2eme
68 AE 5A 2F 85 A7 AC 6E 06 AE 35 31 7E 67 56 2B
3eme
68 AE 5A 2F 85 A7 AC 6E 06 AE 35 31 7E 67 56 2B
ChaineCrypté est un Buffer = CrypteStandard(MonBuffer,CléDecryptHashé,crypteAES128)
Trace(BufferVersHexa(ChaineCrypté))
1er
57 A7 12 D7 C2 2F 9B 9E 4E B5 ED 03 5E 25 E5 A5<\r><\n>D3 1B 04 D4 53 9D 2C 78 08 0C A0 54 2A CE EC 6D
2eme
7E BD 0A 7A 80 83 AD 07 57 41 43 07 C4 26 41 7B<\r><\n>6F 4F 47 98 FD FF 3E AE 2E 06 5F 55 B4 BF 7D 76
3eme
B7 41 DA 35 87 1D B7 C1 11 40 59 5D 84 B6 2E 9A<\r><\n>9C 56 7E 5C 6F 81 C6 A9 8E 71 01 A8 32 CE AD 96


Je veux bien sur récupérer/décrypter sur WM ensuite mais là comment expliquer que sur la même machine que le cryptestandard me donne des résultats différents à chaque fois alors que le Monbuffer et le Clédecryptehashé sont les mêmes ?
Membre enregistré
3 333 messages
Popularité : +93 (137 votes)
Posté le 22 novembre 2021 - 19:39
Paramètres du projet ANSI ou unicode ?
Membre enregistré
191 messages
Popularité : +3 (3 votes)
Posté le 22 novembre 2021 - 20:30
ANSI si c'est bien là qu'il faut trouver l'info...




Membre enregistré
3 333 messages
Popularité : +93 (137 votes)
Posté le 22 novembre 2021 - 23:48
Non ça c'est le paramètre de la langue
Voilà de quoi je parle
https://blogs.pcsoft.fr/fr/chaines-ansi-chaines-unicode-echanges-donnees-entre-differentes-plate-formes/179/read.awp
Je suis sur que sur wm c'est unicode
Du coup soit tu mets WD et wm en ANSI
Soit tu précises toutes tes chaînes dans ton code en ANSI
Il est bizarre que l'on pose toujours et encore cette question
Une simple recherche sur le forum t'aurais fourni la réponse tellement elle est posée
Membre enregistré
191 messages
Popularité : +3 (3 votes)
Posté le 23 novembre 2021 - 08:04
OK
WD en ANSI
WM android en UNICODE
WM iOs pas d'onglet unicode dans la configuration !

Celà n'explique tout de même pas que lorsque je test QUE dans windev les codes ci-dessus, la fonction cryptestandard m'envoi un résultat différend à chaque GO
Membre enregistré
1 144 messages
Popularité : +50 (142 votes)
Posté le 23 novembre 2021 - 08:51
Bonjour,

La fonction CrypteStandard renvoie un résultat différent à chaque appel et c'est le fonctionnement normal. Une randomisation est faite par CrypteStandard ce qui donne un résultat crypté unique et donc différent à chaque exécution.
Une fois le message crypté il faut le mémoriser pour le décrypter plus tard.

--
Thierry TILLIER
Développeur Windev-Webdev
Formation Windev : https://coursdinfo.teachable.com/
Formation bureautique : https://coursdinfo.net
Tuto WINDEV sur ma chaîne Youtube
Posté le 24 février 2023 - 19:38
POUR TOUT T_Login
//On décrypte tous les login de la table et on les compare avec ce qui vient d'être tapé pour vérifier
//que le login existe bien dans la table t_login
sLoginDécrypté = ChaineDécrypte(T_Login.Login)
Trace("sLoginDécrypté :"+sLoginDécrypté+RC+" ChaineDécrypte(T_Login.Login) :"+ChaineDécrypte(T_Login.Login))
SI sLoginDécrypté = sLogin ALORS
//si ChaineDécrypte(T_Login.Login) = sLogin ALORS

//on a trouvé le login, on Hash le mot de passe et on vérifie qu'il correspond avec celui "hashé"
// de la table t_login
sMotDePasseHashé = HashMotDePasse(sMDP)
Trace("sMotDePasseHashé :"+sMotDePasseHashé+RC+"HashMotDePasse(sMDP) :"+HashMotDePasse(sMDP))
SI sMotDePasseHashé = T_Login.MDP ALORS
//si HashMotDePasse(sMDP) = T_Login.MDP ALORS

//CONNEXION
HLitRecherchePremier(T_Utilisateurs,IDT_Utilisateurs,T_Login.IDT_Utilisateurs)
SI HTrouve(T_Utilisateurs) ALORS
gsLogin = sLogin
gsNom = ChaineDécrypte(T_Utilisateurs.Nom)
gsPrénom = ChaineDécrypte(T_Utilisateurs.Prenom)
gnId_Employe = T_Utilisateurs.IDT_Utilisateurs
OuvreFenêtreMobile(FEN_Accueil)
SINON
Info("Vous avez fait une erreur dans la saisie",Faux,1)
RETOUR
FIN
SINON
Info("Vous avez fait une erreur dans la saisie",Faux,1)
RETOUR
FIN
FIN
FIN

Bonsoir Thierry,

J'ai suivi avec beaucoup d'intérêts votre et j'ai essayé de les mettre en pratique.

Ce code fonction bien lorsque je l'éxécute sur le pc, mais dès que je suis le mobile, la variable sLoginDécrypté par exemple qui devraît renvoyer la valeur de ChaineDécrypte(T_Login.Login), renvoie au final une chaine vide

Si vous aviez l'amabilité de m'aiguiller vers une solution.

En vous remerciant par avance.
Erick