PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → [WinDev 19] Pb avec Crypte/Decrypte + compression de chaîne
[WinDev 19] Pb avec Crypte/Decrypte + compression de chaîne
Débuté par Laurent.C, 07 avr. 2014 12:35 - 10 réponses
Posté le 07 avril 2014 - 12:35
Bonjour,

pardonnez mes erreurs s'il y en a car je débute avec Windev merci.

Pour mon projet j'écris dans un fichier .ini (renommé en .dll) l'ensemble des chemins dont j'ai besoin pour mes .fic et autres...

J'utilise également un crypte/decrypte.

Principe de base :
1. Sur clic d'un bouton : je prends la chaîne contenu dans 5 champs de saisie et je vais les écrire dans un fichier de manière cryptée.
2. Sur clic d'un bouton ou en fin d'initialisation de ma fenêtre de démarrage j'exécute une procédure qui va décrypter et lire mon fichier et ramener cette chaîne dans mes champs de saisie.

Le souci rencontré est que pour certains chemins(arborescence parfois assez longue) je me retrouve avec des chaînes de caractères de plus de 60 positions ce qui a pour effet de transformer ma chaîne en symbole que ne sait plus interpréter Windev au moment de réintégrer cette chaîne.

Déjà premières questions : Est-ce normal cette limitation à 60 caractères? Y a t'il volontairement une limite? Peut-on la modifier?

Ayant vu cette limitation j'ai pensé à compresser la chaîne dont voici un extrait ci-dessous

code pour le crypte que je passe sur le bouton 1.(je ne donne ici qu'une ligne à titre d'exemple mais elle sont toutes identiques, seule le nom des variables change)
var_donnees=Crypte(SC_SelecteurRépertoire_FIC.SAI_REP,Cle,compresseLZW,encodeAucun)
INIEcrit("sgbd","fic_donnees",var_donnees,Onglet1.SC_SelecteurFichier_param.SAI_FIC)


de cette manière j'ai un fichier qui ressemble à ça :




Puis ensuite le code pour le decrypte à l'ouverture de la fenêtre de démarrage et/ou sur clic d'un bouton
SC_SelecteurRépertoire_FIC.SAI_REP=Décrypte(INILit("sgbd","fic_donnees","",SC_SelecteurFichier_param.SAI_FIC),Cle,compresseLZW,encodeAucun)


Le problème que j'ai c'est que mon decrypte ne remonte rien dans mes champs de saisie. A croire qu'il ne sait pas décompresser ou lire je ne comprends pas.
J'ai parcouru différents posts qui parlaient de problème de decrypte mais rien trouvé qui correspond à celui ci.

Merci de votre aide.
Posté le 07 avril 2014 - 13:44
Bonjour Laurent

ayant utilisé crypte et décrypte dans pas mal de cas, je peux te dire
qu'il n'y a pas de limite à 60 caractères...

Par contre, le résultat de crypte contient en génral des caractères
binaires qui ne peuvent pas être stockés tel quel dans un fichier ini
(texte)... Comme par exemple le caractère de fin de chaine

Donc, il faut faire CRYPTE suive d'un encodage en texte (par exemple par
URLENCODE ou équivalent) et l'inverse à la lecture

de cette manière, tu transforme le résultat binaire de crypte en chaine
pour le stockage

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International
NOUVEAU: WXShowroom.com est disponible : Montrez vos projets !
Plus d'information sur http://fabriceharari.com


On 4/7/2014 4:35 AM, Laurent.C wrote:
Bonjour,

pardonnez mes erreurs s'il y en a car je débute avec Windev merci.

Pour mon projet j'écris dans un fichier .ini (renommé en .dll)
l'ensemble des chemins dont j'ai besoin pour mes .fic et autres...
J'utilise également un crypte/decrypte.

Principe de base : 1. Sur clic d'un bouton : je prends la chaîne contenu
dans 5 champs de saisie et je vais les écrire dans un fichier de manière
cryptée.
2. Sur clic d'un bouton ou en fin d'initialisation de ma fenêtre de
démarrage j'exécute une procédure qui va décrypter et lire mon fichier
et ramener cette chaîne dans mes champs de saisie.

Le souci rencontré est que pour certains chemins(arborescence parfois
assez longue) je me retrouve avec des chaînes de caractères de plus de
60 positions ce qui a pour effet de transformer ma chaîne en symbole que
ne sait plus interpréter Windev au moment de réintégrer cette chaîne.

Déjà premières questions : Est-ce normal cette limitation à 60
caractères? Y a t'il volontairement une limite? Peut-on la modifier?

Ayant vu cette limitation j'ai pensé à compresser la chaîne dont voici
un extrait ci-dessous

code pour le crypte que je passe sur le bouton 1.(je ne donne ici qu'une
ligne à titre d'exemple mais elle sont toutes identiques, seule le nom
des variables change)
var_donnees=Crypte(SC_SelecteurRépertoire_FIC.SAI_REP,Cle,compresseLZW,encodeAucun)

INIEcrit("sgbd","fic_donnees",var_donnees,Onglet1.SC_SelecteurFichier_param.SAI_FIC)


de cette manière j'ai un fichier qui ressemble à ça :





Puis ensuite le code pour le decrypte à l'ouverture de la fenêtre de
démarrage et/ou sur clic d'un bouton
SC_SelecteurRépertoire_FIC.SAI_REP=Décrypte(INILit("sgbd","fic_donnees","",SC_SelecteurFichier_param.SAI_FIC),Cle,compresseLZW,encodeAucun)


Le problème que j'ai c'est que mon decrypte ne remonte rien dans mes
champs de saisie. A croire qu'il ne sait pas décompresser ou lire je ne
comprends pas.
J'ai parcouru différents posts qui parlaient de problème de decrypte
mais rien trouvé qui correspond à celui ci.

Merci de votre aide.
Posté le 07 avril 2014 - 14:30
Bonjour,

Tu pars sur de mauvaises bases.
Vu de l'extérieur, ton problème est un problème simple. Tu dois donc te dire qu'il y a une solution simple à ce problème.

Si Windev obligeait les informaticiens à compresser les chaines de caractères pour qu'elles fassent moins de 60 caractères, alors PCSoft aurait fermé boutique depuis longtemps.

Il ne faut pas bâtir une usine à gaz pour solutionner une question simple, et c'est ce que tu es en train de faire.

Tu as un champ de saisie dans lequel tu stockes un nom de répertoire, ou un nom de fichier.
Ce champ de saisie DOIT te renvoyer ce que tu as écrit. Point final. Il n'y a pas à tergiverser là dessus.

Et il faut comprendre pourquoi ton champ de saisie transforme la chaîne saisie.
Dans les paramètres de ton champ de saisie (onglet Détail ou onglet Général) , il n'y aurait pas des trucs cochés, qui ne devraient pas l'être ?
Ta chaîne 'bizarre' elle ne se finirait pas par ~1 par hasard ?
Et dans ce cas, je regarderais du côté de fcheminlong() ou fchemincourt() ...


La suite de ton problème ( inilit qui ne renvoie pas ce que tu as écrit ) ... ça se résoudra certainement quand tu reviendras à ton plan de départ : écrire le nom de ficher tel quel, et sans passer par une compression/cryptage.
Posté le 07 avril 2014 - 17:22
J'ai fait l'essai Xfois.

Si j'ai un chemin court que je crypte ex : D:\MonProjet\MesFichiers.xxx tout va bien
Dès qu'il dépasse 60 caractères ça ne fonctionne plus.

J'ajoute que ce programme a initialement été développé en WD18 et que je l'ai repassé en 19. (Aucun problème)
Je ne suis pas dans la possibilité de tester avec une version 18 pour voir si j'ai le même problème.
Il n'y a pas d'espace dans ma chaîne.

Dans la description de mes champs de saisie,

Type = Texte
Masque de saisie = Nom et Chemin complet d'un fichier
Taille de saisie = Il bloque à 260 caractères, même si je mets 0 il accepte la validation, mais quand j'y retourne il me remet 260 caractères.
Assister la saisie de chemin de fichier = est coché

Je ne sais pas quoi vous donner d'autre comme indication.
Posté le 07 avril 2014 - 19:23
Soyons clair.


Windev limite la taille de saisie à 260 caractères ?
OUI, normal. cf par exemple : http://support.microsoft.com/kb/148754/fr
Si vous voulez dépasser cette limite de 260 caractères, paramétrez le champ de saisie comme une chaîne de caractères quelconque, et non comme un nom de fichier. Et dans un 2nd temps, vous pourrez ajouter un bouton à coté pour aider l'utilisateur à saisir le nom de fichier ( cf fonction fselecteur ...mais fselecteur aussi tronque à 260 caractères)


Windev plante si le chemin du fichier fait plus de 60 caractères ?
NON.
Faites le test tout simple, avec un bouton et le code :
Info(saisie1, taille(saisie1))
Je viens de créer un champ de saisie avec les mêmes propriétés que ce que vous dites, et Windev accepte plus de 60 caractères, sans déformer du tout le nom du fichier que je saisis.
Mais pas plus de 260 caractères , effectivement.


Dans tous les cas, l'idée était mauvaise.
Tu avais un nom de fichier faux ou tronqué.
Tu repartais de ce nom de fichier faux, tu compressais cette chaîne ... tu décompressais, et tu espérais retrouver la chaîne correcte.

Non. après compression / décompression, tu retrouveras au mieux la chaîne fausse d'origine, et rien de plus.

Et en l'occurrence, Inilit / Iniécrit savent traiter des chaines relativement longues ... tant que ces chaines ne contiennent pas des caractères 'exotiques' ( caractère FinDeLigne ou FinDeFichier en particulier)
En cryptant/Compressant le nom de fichier, j'imagine que tu te retrouves avec des caractères complètement incompatibles avec IniEcrit.


Souvent, quand ils ont un bug, les développeurs AJOUTENT des lignes de code pour corriger le bug.
NON !
Quand il y a un bug, la solution, c'est généralement d'enlever des lignes de codes, et pas d'en rajouter.

Avec la compression, tu as ajouté un 2ème bug, tu n'as pas corrigé le premier bug.
Posté le 08 avril 2014 - 09:06
Fais ton crypte avec les arguments ci-dessous, tu n'auras pas de problème dans un fichier INI, tous les caractères seront reconnus :
Crypte(<Chaine>,<Mot de passe>,crypteSécurisé,encodePCS)
Membre enregistré
16 messages
Posté le 18 juin 2014 - 19:13
Bonjour,
Qu'est-ce que ça fait plaisir ... je lutte depuis plusieurs jours avec exactement le même pb. Je suppose que je souhaitais faire comme Laurent C, à savoir stocker dans un fichier INI des chaines cryptées ....
et j'allais laisser tomber jusqu'à ce je lise son post ....

Je confirme donc ce pb et la limite des 60 caractères (je suis avec WD14)

Voici ma fonction de cryptage :
PROCEDURE MonCrypte(Chn)

Chn1 est une chaîne=Crypte(Chn,"MonMotdePasse",crypteRapide,encodePCS) //elle est pleine de caractères bizarres
Chn2 est une chaîne=""
POUR i=1 _A_ Taille(Chn1)
Chn2+=NumériqueVersChaîne(Asc(Chn1[[i]]),"X")
FIN
RENVOYER Chn2

//j'ai souhaité prendre chaque caractère de la chaine et le transformer en hexadécimal pour être sûr d'obtenir une chaine (de caractères numériques) qui puisse s'écrire dans un fichier INI

et ma fonction de décryptage
PROCEDURE MonDecrypte(chn)
Chn2 est une chaîne=""
POUR i=1 _A_ Taille(chn)/2
Chn2+=Caract(Val(chn[[2*i-1 A 2*i]],"x"))
FIN
RENVOYER Décrypte(Chn2, "MonMotdePasse",crypteRapide,encodePCS)

Si quelqu'un détecte le pb, je lui serais très reconnaissant !
Membre enregistré
16 messages
Posté le 18 juin 2014 - 19:19
@Rémi B : Je confirme que le résultat de la fonction Crypte avec les paramètres "CrypteSécurisé,encodePCS" peut amener une chaine que l'on ne peut écrire en l'état dans un fichier INI. Ou plutôt que cette chaine ne pourra pas être relue par un INIlit

@Joel : Ok pour cette limite des 260 caractères mais même en y prenant garde, le pb se pose bien avant puisque c'est au 60 ième caractère

@Laurent. C : Je concatène 7 chaines pour obtenir la chaine à crypter.
Membre enregistré
16 messages
Posté le 18 juin 2014 - 19:27
@Fabrice H : Yes ! ta solution est une bonne solution !!
Posté le 19 juin 2014 - 03:11
Bonjour Michel

stocker le résultat de la fonction crypte dans une chaine, c'est
chercher les ennuis, étant donné que ce résultat est BINAIRE. Il faut
le stocker dans un buffer... De la, tu devrais pouvoir faire ta transfo
en hexa (buffervershexa) facilement

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

NOUVEAU: WXShowroom.com est disponible : Montrez vos projets !
Plus d'information sur http://fabriceharari.com


On 6/18/2014 11:13 AM, MichelD wrote:
Bonjour,
Qu'est-ce que ça fait plaisir ... je lutte depuis plusieurs jours avec
exactement le même pb. Je suppose que je souhaitais faire comme Laurent
C, à savoir stocker dans un fichier INI des chaines cryptées ....
et j'allais laisser tomber jusqu'à ce je lise son post ....
Je confirme donc ce pb et la limite des 60 caractères (je suis avec WD14)

Voici ma fonction de cryptage :
PROCEDURE MonCrypte(Chn)

Chn1 est une chaîne=Crypte(Chn,"MonMotdePasse",crypteRapide,encodePCS)
//elle est pleine de caractères bizarres
Chn2 est une chaîne=""
POUR i=1 _A_ Taille(Chn1)
Chn2+=NumériqueVersChaîne(Asc(Chn1[[i]]),"X")
FIN
RENVOYER Chn2

//j'ai souhaité prendre chaque caractère de la chaine et le transformer
en hexadécimal pour être sûr d'obtenir une chaine (de caractères
numériques) qui puisse s'écrire dans un fichier INI
et ma fonction de décryptage
PROCEDURE MonDecrypte(chn)
Chn2 est une chaîne=""
POUR i=1 _A_ Taille(chn)/2
Chn2+=Caract(Val(chn[[2*i-1 A 2*i]],"x"))
FIN
RENVOYER Décrypte(Chn2, "MonMotdePasse",crypteRapide,encodePCS)

Si quelqu'un détecte le pb, je lui serais très reconnaissant !
Membre enregistré
16 messages
Posté le 25 juin 2014 - 10:50
C'est bien noté, merci.
Michel