[R] Décrypter

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Amesamana
Niveau 5
Niveau 5
Messages : 108
Enregistré le : dim. 09 sept. 2012 16:37
Status : Hors ligne

[R] Décrypter

#1

Message par Amesamana »

Bonjour,

j'ai besoin d'une lumière ;)

Je code un petit outil pour enregistrer des données dans un fichier .txt et que je crypte.
Ces données son à chaque fois sur trois lignes.
Je crypte ces données et je veux pouvoir les décrypter, jusqu'à là pas de soucis.
Mon soucis et que si je rentre une nouvelle donnée de trois lignes cette deuxième saisies n'est pas décryptées ?

Par exemple première saisie (Age, nom, ville)
28
Florence
Paris

Ce qui donne dans mon fichier texte
n˜…
KpÎÉ›E(X°!S¤â=”d­3j‹ÔyoaƒlÄš:†!}ÿƒ€×©†ê6’ÕE)Ž›jIn˜…
KpÎÉ›E(X°!S¤â=”d­3j‹ÔyoaƒlÄš:†!}ÿƒ€×©†ê6’ÕE)Ž›jI¡®¾ôKMY‹.Žo¢àh¿àœ\·jp;Ð6mÛiPˆ±î0q½,ãJ¦P%sƒ) _-j©Lë^ñ*
Je peux donc crypter et afficher le résultat décrypté jusqu'à la pas de soucis

Ensuite si je rentre :
32
Maxime
Marseille

J'obtiens :
Age : 28
Prénom : Florence
Ville : Paris

êÄäj8ÑÊmÞÍÅ:ù7Ø/)¨~¹‘Ãêž³EW|øF^ï
¸/ÌÈF~ã‡IïÍ=å«X6]ŽÛ‡‹¹êõ¹U>²ö#ì+BWðºa‰Òä;-½´[ŠòÑP멵'†DíBÞÀßTcD­B
Voici un exemple :
#include <Crypt.au3>
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
Global $FIHCHIER = @HomeDrive & "\test.txt"
Global $Val1 = 'A toi de choisir'
Global $FIHC
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 615, 396, 192, 124)
$Input1 = GUICtrlCreateInput("", 16, 24, 153, 21)
$Input2 = GUICtrlCreateInput("", 16, 56, 153, 21)
$Input3 = GUICtrlCreateInput("", 16, 88, 153, 21)
$bt_crypter = GUICtrlCreateButton("Crypter", 16, 136, 153, 25)
$bt_decrypt = GUICtrlCreateButton("Affciher", 16, 184, 153, 25)
$Edit1 = GUICtrlCreateEdit("", 192, 8, 401, 369)
GUICtrlSetData(-1, "")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE
         Exit
      Case $bt_crypter
         Local $readD1 = GUICtrlRead($Input1)
         Local $readD2 = GUICtrlRead($Input2)
         Local $readD3 = GUICtrlRead($Input3)
         $FIHC &= "************" & @CRLF
         $FIHC &= "Age : "
         $FIHC &= $readD1 & @CRLF
         $FIHC &= "Prénom : "
         $FIHC &= $readD2 & @CRLF
         $FIHC &= "Ville : "
         $FIHC &= $readD3 & @CRLF
         Local $sEncrypted = StringEncrypt(True, $FIHC, $Val1)
            FileWrite($FIHCHIER, $sEncrypted)
      Case $bt_decrypt
         Local $rREADF = FileRead($FIHCHIER)
         Local $sDecrypted = StringEncrypt(False, $rREADF, $Val1)
         MsgBox(0, "", $sDecrypted)
         GUICtrlSetData($Edit1, $sDecrypted)
   EndSwitch
WEnd

Func StringEncrypt($bEncrypt, $sData, $sPassword)
   _Crypt_Startup() ; Exécute la bibliothèque Crypt.
   Local $sReturn = ''
   If $bEncrypt Then ; Si l'indicateur est défini à True alors chiffrer, sinon déchiffrer.
      $sReturn = _Crypt_EncryptData($sData, $sPassword, $CALG_RC4)
   Else
      $sReturn = BinaryToString(_Crypt_DecryptData($sData, $sPassword, $CALG_RC4))
   EndIf
   _Crypt_Shutdown() ; Arrête la bibliothèque Crypt.
   Return $sReturn
EndFunc   ;==>StringEncrypt
Merci.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Décrypter

#2

Message par orax »

Il faut utiliser _Crypt_EncryptData sur l'ensemble des données, pas seulement sur celles qui viennent d'être ajoutées. Voir les commentaires.
#include <Crypt.au3>
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
Global $FIHCHIER = @HomeDrive & "\test.txt"
Global $Val1 = 'A toi de choisir'
Global $FIHC
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 615, 396, 192, 124)
$Input1 = GUICtrlCreateInput("", 16, 24, 153, 21)
$Input2 = GUICtrlCreateInput("", 16, 56, 153, 21)
$Input3 = GUICtrlCreateInput("", 16, 88, 153, 21)
$bt_crypter = GUICtrlCreateButton("Crypter", 16, 136, 153, 25)
$bt_decrypt = GUICtrlCreateButton("Affciher", 16, 184, 153, 25)
$Edit1 = GUICtrlCreateEdit("", 192, 8, 401, 369)
GUICtrlSetData(-1, "")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE
         Exit
      Case $bt_crypter
         Local $readD1 = GUICtrlRead($Input1)
         Local $readD2 = GUICtrlRead($Input2)
         Local $readD3 = GUICtrlRead($Input3)

            ; on lit et déchiffre le contenu du fichier
         $hfile = FileOpen($FIHCHIER, $FO_BINARY)
         $FIHC = StringEncrypt(False, FileRead($hfile), $Val1)
         FileClose($hfile)

         $FIHC &= "************" & @CRLF
         $FIHC &= "Age : "
         $FIHC &= $readD1 & @CRLF
         $FIHC &= "Prénom : "
         $FIHC &= $readD2 & @CRLF
         $FIHC &= "Ville : "
         $FIHC &= $readD3 & @CRLF

            ; on rechiffre TOUT le contenu (pas seulement ce qui a été ajouté)
         Local $sEncrypted = StringEncrypt(True, $FIHC, $Val1)
         $hfile = FileOpen($FIHCHIER, $FO_OVERWRITE + $FO_BINARY)
         FileWrite($hfile, $sEncrypted)
         FileClose($hfile)
      Case $bt_decrypt
         $hfile = FileOpen($FIHCHIER, $FO_BINARY)
         Local $rREADF = FileRead($hfile)
         FileClose($hfile)
         Local $sDecrypted = StringEncrypt(False, $rREADF, $Val1)
         MsgBox(0, "", $sDecrypted)
         GUICtrlSetData($Edit1, $sDecrypted)
   EndSwitch
WEnd

Func StringEncrypt($bEncrypt, $sData, $sPassword)
   _Crypt_Startup() ; Exécute la bibliothèque Crypt.
   Local $sReturn = ''
   If $bEncrypt Then ; Si l'indicateur est défini à True alors chiffrer, sinon déchiffrer.
      $sReturn = _Crypt_EncryptData($sData, $sPassword, $CALG_RC4)
   Else
      $sReturn = BinaryToString(_Crypt_DecryptData($sData, $sPassword, $CALG_RC4))
   EndIf
   _Crypt_Shutdown() ; Arrête la bibliothèque Crypt.
   Return $sReturn
EndFunc   ;==>StringEncrypt
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Amesamana
Niveau 5
Niveau 5
Messages : 108
Enregistré le : dim. 09 sept. 2012 16:37
Status : Hors ligne

Re: [..] Décrypter

#3

Message par Amesamana »

super ;) Merci Orax
Amesamana
Niveau 5
Niveau 5
Messages : 108
Enregistré le : dim. 09 sept. 2012 16:37
Status : Hors ligne

Re: [..] Décrypter

#4

Message par Amesamana »

Bonjour,

je reprends cette exemple pour une demande.
j'ai ma liste de créé comme ceci par exemple.

************
Prénom : Maxime
Age : 26
Ville : Paris
************
Prénom : Florence
Age : 32
Ville : Marseille
************
Prénom : Zoe
Age : 43
Ville : Lyon
************
Prénom : Alain
Age : 21
Ville : Bordeaux


Je voudrais pourvoir la trier par ordre alphabétique des prénoms.
_ArrayDisplay et _ArraySort devrait faire l'affaire mais je ne trouve pas comment !
Merci.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Décrypter

#5

Message par Tlem »

Bonjour Amesamana
Pour pouvoir faire ce que vous demandez, vous allez devez construire un tableau à 2 dimensions (Prénom, Age, Ville) puis effectuer le tri sur la colonne désiré.

D'après ce que j'ai lu des messages précédents, vous devez lire et décrypter les données de votre fichier.
Ensuite vous devrez mettre les données décryptées dans le tableau 2D.
Puis vous devrez trier le tableau sur la colonne désirée.
Enfin vous devrez lire les données triées pour reconstruire votre fichier et re-crypter le tout ...
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Amesamana
Niveau 5
Niveau 5
Messages : 108
Enregistré le : dim. 09 sept. 2012 16:37
Status : Hors ligne

Re: [R] Décrypter

#6

Message par Amesamana »

Bonjour Tlem,

Merci pour la réponse et la ligne à suivre.
Bon je commence pas très bien ! Je ne comprends pas pourquoi ceci ne fonctionne pas.
Dans ce tab.txt les données ci-dessus.
#include <Array.au3>
#include <File.au3>

Global $Tab
Global $MFichier = 'C:\tab.txt'

_FileReadToArray($MFichier, $Tab) ; Affichage du tableau toute mes données sont sur une colonne
_ArrayDisplay($Tab, 'Test')

Global $Tab2D[$Tab[0]][5]

For $i = 1 To $Tab[0]
    Local $aMiniTableau = StringSplit($Tab[$i], ":")
    $Tab2D[$i-1][0] = $aMiniTableau[1]
    $Tab2D[$i-1][1] = $aMiniTableau[2]
    $Tab2D[$i-1][2] = $aMiniTableau[3]
   $Tab2D[$i-1][3] = $aMiniTableau[4]
Next

_ArrayDisplay($Tab2D, 'Tableau2') ; Affichage du tableau2D mais rien ne s'affiche ?
_ArraySort($Tab2D, 0, 0, 0, 2); tri colonne 2
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [R] Décrypter

#7

Message par Tlem »

Bonjour Amesamana.
Voici une des nombreuses méthodes possibles :
#include <Array.au3>
#include <File.au3>

Global $Tab
Global $MFichier = 'tab.txt'

_FileReadToArray($MFichier, $Tab) ; Mise en tableau des données du fichier tab.txt
_ArrayDisplay($Tab, 'Tableau des données') ; Affichage du tableau des données sur une colonne


; Ici, on calcule le nombre de ligne nécessaires pour construire le tableau 2D.
; On prends le nombre total de ligne du tableau $Tab et on le divise par 4 (puisque vous avez 4 lignes par personne).
; Soit : Ubound($Tab)/4

; Puisque l'on veux faire un tableau 2D avec 3 colonnes et Ubound($Tab)/4 lignes, on fait :
Global $Tab2D[UBound($Tab) / 4][3]
_ArrayDisplay($Tab2D, 'Tableau2D vide') ; Affichage du tableau2D vide

; Maintenant, nous allons peupler les cases.  ^^
; On va lire le tableau $Tab qui contient successivement la ligne des étoiles, un prénom, un age, une ville,
; puis on recommence la ligne des étoiles, un prénom, un age, une ville, etc ...

$Tab2DLine = 0 ; Initialisation de la valeur de la première ligne du tableau à peupler

For $i = 1 To UBound($Tab) - 1 Step 4 ; Lecture du tableau $Tab par pas de 4
   ; On commence par vérifier que la première ligne soit celle avec les étoiles.
   If $Tab[$i] = "************" Then
      ; Ensuite on récupère la ligne Prénom, puis Age et enfin la Ville
      $Tab2D[$Tab2DLine][0] = StringTrimLeft($Tab[$i + 1], 9 ) ; Prénom
      $Tab2D[$Tab2DLine][1] = StringTrimLeft($Tab[$i + 2], 6 ) ; Age
      $Tab2D[$Tab2DLine][2] = StringTrimLeft($Tab[$i + 3], 8 ) ; Ville
      $Tab2DLine += 1 ; On rajoute 1 pour passer à la ligne suivant
   EndIf
Next

_ArraySort($Tab2D, 0, 0, 0, 1); tri sur l'Age
_ArrayDisplay($Tab2D, 'Tri sur Age') ; Affichage du tableau2D

_ArraySort($Tab2D, 0, 0, 0, 0); tri le nom1
_ArrayDisplay($Tab2D, 'Tri sur Nom') ; Affichage du tableau2D
Maintenant, je ne vois pas vraiment l’intérêt de réécrire dans votre fichier de données la désignation de chaque élément.
Ceci devrait suffire :
************
Maxime
26
Paris
************
Prénom : Florence
32
Marseille
************
Prénom : Zoe
43
Lyon
************
Prénom : Alain
21
Bordeaux
et dans ce cas il suffira de remplacer :
$Tab2D[$Tab2DLine][0] = StringTrimLeft($Tab[$i + 1], 9 ) ; Prénom
$Tab2D[$Tab2DLine][1] = StringTrimLeft($Tab[$i + 2], 6 ) ; Age
$Tab2D[$Tab2DLine][2] = StringTrimLeft($Tab[$i + 3], 8 ) ; Ville
par
$Tab2D[$Tab2DLine][0] = $Tab[$i + 1] ; Prénom
$Tab2D[$Tab2DLine][1] = $Tab[$i + 2] ; Age
$Tab2D[$Tab2DLine][2] = $Tab[$i + 3] ; Ville
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Amesamana
Niveau 5
Niveau 5
Messages : 108
Enregistré le : dim. 09 sept. 2012 16:37
Status : Hors ligne

Re: [R] Décrypter

#8

Message par Amesamana »

Bonjour Tlem,

merci pour ces explications :D

Alors je ne pige pas car le tableau tri sur l'Age et tri sur Nom n’affiche rien, ils restent vide.
J'ai bien compris grâce à vos explications la démarche à suivre et je comprends que l'inscription se fait grâce à la boucle For.
Pourquoi celle-ci ne retourne pas les données ?

Je bosse dessus !
Merci.

[Edit]
Désolé Tlem un soucis d'espace dans le fichier test Tab.txt.
Cela fonctionne très bien !
Merci pour ces explications.
Bonne journée et bonnes fêtes de fin d'année.
Amesamana
Niveau 5
Niveau 5
Messages : 108
Enregistré le : dim. 09 sept. 2012 16:37
Status : Hors ligne

Re: [R] Décrypter

#9

Message par Amesamana »

Bonsoir,

Bon je voulais trouver cette explication/solution par moi même mais je n'y parviens pas !
Quand je fais mon tri et que je veux entrer de nouvelles données et que je sélectionne le tri mon tableau 1D ne s'affiche plus et mon 2D est bien vide !?
Case $bt_trier
         GUICtrlSetData($Edit1, ""); On vide GUICtrlCreateEdit
         Sleep(200); juste pour s'assurer visuellement de l'action
         FileOpen($stabFic, $FO_OVERWRITE); ouvre le fichier avec le paramètre d'écriture (efface le contenu précédent en cas de nouvelle données)
         FileWrite($stabFic, $sDecrypted) ; Ecrit dans le fichier le décryptage

         _FileReadToArray($stabFic, $Tab) ; Mise en tableau des données du fichier tab.txt
         _ArrayDisplay($Tab, "") ; Affiche le tableau

         Global $Tab2D[UBound($Tab) / 4][4] ; déclare le tableau 4 colonnes 4 lignes
         $Tab2DLine = 0 ; Initialisation de la valeur de la première ligne du tableau à peupler

         For $i = 1 To UBound($Tab) - 1 Step 4 ; Lecture du tableau $Tab par pas de 4
            ; On commence par vérifier que la première ligne soit celle avec les étoiles.
            If $Tab[$i] = "************" Then
               ; Ensuite on récupère la ligne Prénom, puis Age et enfin la Ville
               $Tab2D[$Tab2DLine][0] = "************" ; on réinscrit
               $Tab2D[$Tab2DLine][1] = $Tab[$i + 1] ; Prénom
               $Tab2D[$Tab2DLine][2] = $Tab[$i + 2] ; Age
               $Tab2D[$Tab2DLine][3] = $Tab[$i + 3] ; Ville
               $Tab2DLine += 1 ; On rajoute 1 pour passer à la ligne suivant
            EndIf
         Next

         _ArraySort($Tab2D, 0, 0, 0, 1) ; tri le prénom
         _FileWriteFromArray($stabFic, $Tab2D)
         _ArrayDisplay($Tab2D, "")

         $rtxt = FileRead($stabFic)
         $txt2 = StringReplace($rtxt, '|', @CRLF) ; on remplace le pipe par un chariot
         FileWrite($stabFic2, $txt2) ; on écrit le résultat dans le fichier
         $rresult = FileRead($stabFic2) ; on lit le fichier
         GUICtrlSetData($Edit1, "") ; On vide GUICtrlCreateEdit
         GUICtrlSetData($Edit1, $rresult) ; on inscrit dans GUICtrlCreateEdit
         FileClose($stabFic2) ; on ferme
         FileDelete($stabFic2) ; on ferme
         FileClose($stabFic) ; on supprime
         FileDelete($stabFic) ; on supprime
         save() ; on enregistre
;~          RestartScript() ; on évite le fameux plantage qui donne envie de taper la tête sur le mur :) Chose qui ne me va pas car cela oblige dns l'outil de saisir à nouveau le mot de passe.
Merci.
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1037
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [R] Décrypter

#10

Message par walkson »

Bonjour,
C'est très gentil d'économiser la place sur le forum en mettant vos posts à la suite, je suis sûr que Tlem (le Boss) y sera très sensible mais quant à la lecture de vos problèmes, je crains que sur un sujet résolu qui, plus est, n'a rien à voir avec "Décrypter" que vous obteniez quelques réponses. Je vous conseille fortement de créer un nouveau sujet mais c'est un avis qui n'engage que moi. :mrgreen:

Une petite remarque sur votre code
venu tout droit de l'aide
$sFilePath = @TempDir & "\FileWrite.txt"
Local $hFileOpen = FileOpen($sFilePath, $FO_APPEND)
FileWrite($hFileOpen, "Line 2")
venu tout droit de votre code
FileOpen($stabFic, $FO_OVERWRITE)
FileWrite($stabFic, $sDecrypted)
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Amesamana
Niveau 5
Niveau 5
Messages : 108
Enregistré le : dim. 09 sept. 2012 16:37
Status : Hors ligne

Re: [R] Décrypter

#11

Message par Amesamana »

Bonjour,

Effectivement ! J'ai pourtant hésiter mais étant donnée la présence de la réponse de Tlem sur le tri j'ai pensé que c'était mieux.
Mais tu as raison !

Au final j'y suis arrivé et tout simplement avec
Local $hFileOpen = FileOpen($stabFic, 2)
et déplacé
FileDelete($stabFic) ; on supprime
sous
Case $GUI_EVENT_CLOSE
Case $bt_trier

         GUICtrlSetData($Edit1, "") ; On vide GUICtrlCreateEdit
         Sleep(100) ; juste pour s'assurer visuellement de l'action
         Local $hFileOpen = FileOpen($stabFic, 2)
         If $hFileOpen = -1 Then
            MsgBox($MB_SYSTEMMODAL, "", "Une erreur est survenue pendant la lecture du fichier.")
         EndIf
         FileWrite($hFileOpen, $sDecrypted) ; Ecrit dans le fichier le décryptage
         _FileReadToArray($stabFic, $Tab) ; Mise en tableau des données du fichier tab.txt
         _ArrayDisplay($Tab, "") ; Affiche le tableau
         Global $Tab2D[UBound($Tab) / 4][4] ; déclare le tableau 4 colonnes 4 lignes
         $Tab2DLine = 0 ; Initialisation de la valeur de la première ligne du tableau à peupler

         For $i = 1 To UBound($Tab) - 1 Step 4 ; Lecture du tableau $Tab par pas de 4
            ; On commence par vérifier que la première ligne soit celle avec les étoiles.
            If $Tab[$i] = "************" Then
               ; Ensuite on récupère la ligne Prénom, puis Age et enfin la Ville
               $Tab2D[$Tab2DLine][0] = "************" ; on réinscrit
               $Tab2D[$Tab2DLine][1] = $Tab[$i + 1] ; Prénom
               $Tab2D[$Tab2DLine][2] = $Tab[$i + 2] ; Age
               $Tab2D[$Tab2DLine][3] = $Tab[$i + 3] ; Ville
               $Tab2DLine += 1 ; On rajoute 1 pour passer à la ligne suivant
            EndIf
         Next
         _ArraySort($Tab2D, 0, 0, 0, 1) ; tri le prénom
         _FileWriteFromArray($stabFic, $Tab2D)
         _ArrayDisplay($Tab2D, "")
         $rtxt = FileRead($stabFic)
         $txt2 = StringReplace($rtxt, '|', @CRLF) ; on remplace le pipe par un chariot
         FileWrite($stabFic2, $txt2) ; on écrit le résultat dans le fichier
         $rresult = FileRead($stabFic2) ; on lit le fichier
         GUICtrlSetData($Edit1, "") ; On vide GUICtrlCreateEdit
         GUICtrlSetData($Edit1, $rresult) ; on inscrit dans GUICtrlCreateEdit
         FileClose($stabFic2) ; on ferme
         FileDelete($stabFic2) ; on supprime
         FileClose($stabFic) ; on ferme
         save() ; on enregistre
Merci.
Répondre