Aller au menu - Aller au contenu

Icône [TP] Un peu de cryptographie

Mise à jour : 10/11/2011
Difficulté : Intermédiaire Intermédiaire Durée d'étude : 2 heures Creative Commons BY-NC-SA
3 274 visites depuis 7 jours, dont 56 sur ce chapitre classé 50/786
Aujourd'hui je suis aigri. Et pas de chance pour vous, c'est tombé le jour de l'écriture de ce tutoriel. Alors on ne va pas y aller par quatre chemins : c'est à vous de bosser maintenant ! J'ai essayé de varier un peu par rapport à ce qui peut être proposé dans les tutoriels présents sur le site du zéro, et on va donc créer un logiciel de chiffrement o_O . Vous avez bien entendu, un vrai logiciel puissant et efficace, qui va nous permettre de chiffrer et déchiffrer du texte, des fichiers, et ceci en quelques heures seulement. (Voire en quelques minutes lorsque vous serez plus à l'aise !)

Tentés par l’expérience ? C'est par là ! Sinon, vous connaissez la sortie... :p
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Vous avez dit Cryptographie?

Cryptographie. Quel joli mot, vous ne trouvez pas ? Bon, je vais rester très succinct, mais une petite pause littéraire et scientifique ne vous fera que du bien après ces heures passées avec votre ordinateur.

Un peu de culture générale


Quand j'ai voulu publier ce tutoriel, un méchant validateur m'a dit : à chaque fois que tu parles de cryptage, c'est faux. Utilise le mot chiffrement à la place. Et comme je n'aime pas qu'on me contrarie, j'ai tué ce validateur je voulais comprendre, j'ai rassemblé pour vous les informations à retenir.

Vous suivez ? C'est parti :
  • Un cryptogramme est un message chiffré.
  • La cryptologie est la science qui regroupe la cryptographie et la cryptanalyse.
  • La cryptographie est la science qui vise à créer des cryptogrammes. Ce nom vient des mots en grec ancien kruptos (« caché ») et graphein (« écrire »).
  • La cryptanalyse au contraire est la science qui analyse les cryptogrammes dans l'espoir de les décrypter.


Ça va encore ? On complique :
  • Le chiffrement est la transformation à l'aide d'une clé d'un message en clair (dit texte clair) en un message incompréhensible (dit texte chiffré) pour celui qui ne dispose pas de la clé de déchiffrement (en anglais, on dit 'encryption').
  • Le décryptage est le fait de retrouver le message en clair correspondant à un message chiffré sans posséder la clé de déchiffrement (terme que ne possèdent pas les anglophones, qui eux « cassent » des codes secrets).


Voilà pourquoi on va parler de chiffrement/déchiffrement d'un message quand on connait la clef de (dé)chiffrement et de décryptage quand on ne connait pas cette clef. Quand on décrypte, on casse le chiffrement.


Et du coup, qu'en est il du mot "Cryptage" ?

Ce mot n'est tout simplement pas français. Il n'existe pas dans le dictionnaire et n'a aucun sens. Il est très souvent confondu avec le mot "chiffrement" à cause de l'utilisation d'anglicismes, mais n'est, pour l'instant, pas toléré par l'académie française.

On va s’arrêter là pour le cours d'étymologie, vous savez où trouver plus d'informations. ( Ici :-° )

Instructions pour réaliser le TP

Je vous propose aujourd'hui de créer les bases d'une future application permettant de chiffrer des textes et documents. Et vous allez voir qu'avec Autoit, c'est simple ! (Beau slogan vous ne trouvez pas ? :-° )

On veut donc créer un logiciel de chiffrement qui ressemble à ceci :

Image utilisateur


Rien de bien compliqué donc, quelques labels, un édit, un combo, un champ de type 'password', 2 boutons radios, 3 boutons, et 4 groupes. Vous savez déjà comment créer et utiliser la plupart de ces contrôles, je vais donc uniquement vous donner une ou deux précisions :
  • Pour un Combo, voir l'aide afin de savoir comment ajouter des items.
  • Pour le champ de type 'password', il suffit de rajouter une certaine variable dans le paramètre style de la fonction GUICtrlCreateInput.
  • Pour créer une fenêtre via laquelle on peut sélectionner un fichier sur le disque, cherchez du côté de FileOpenDialog.


Concernant le chiffrement en lui même, on ne va pas aller très loin dans les détails. Sachez que ce sont les fonctions _Crypt_EncryptData et _Crypt_EncryptFile ainsi que leurs homologues _Crypt_DecryptData et _Crypt_DecryptFile qui nous intéressent. Ces fonctions nécessitent plusieurs paramètres. Pour pouvoir les utiliser, il vous faudra rajouter l'include nécessaire au début de votre script.
Concernant les algorithmes, on va utiliser les suivants : RC4|3DES|AES 128|AES 192|AES 256|DES|RC2
Je ne vous en dis pas plus, la documentation est très complète sur ce point.

Voilà, vous disposez de tout ce dont avez besoin, alors au boulot !

Correction

Bon, si vous en arrivez là, c'est que tout s'est bien passé et que votre logiciel est terminé !
(Je parle aux quelques personnes qui ont effectivement fait ce TP. Ceux qui se contentent de lire sans essayer auparavant... :colere2: )

Si vous avez du mal, je vous conseille de jeter un oeil sur cette vidéo. Vous pourrez apercevoir la création de ma fenêtre avec Koda.



Voilà donc une manière de répondre à notre cahier des charges :
Secret (cliquez pour afficher)
Code : Autre
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include <Crypt.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>

#cs ----------------------------------------------------------------------------

        AutoIt Version : 3.3.6.0
        Auteur:         Malossane Timothée

        Fonction du Script :
        Tutoriel 'La Programmation avec Autoit'
        TP sur les GUIs, Logiciel de cryptage.

#ce ----------------------------------------------------------------------------
Global $SourceFile = ''; Initialisation, si la personne clique sur le bouton d'encryption avant d'avoir choisi un fichier
Global $algo

#Region ### START Koda GUI section ### Form=
Global $Form1_1 = GUICreate("TP_Cryptage Par Malossane timothée", 629, 388, 204, 116)
Global $Group1 = GUICtrlCreateGroup("Que voulez vous crypter?", 32, 16, 177, 89)
Global $Radio1 = GUICtrlCreateRadio("Un fichier", 64, 40, 113, 17)
Global $Radio2 = GUICtrlCreateRadio("Un Texte", 64, 64, 113, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
GUICtrlCreateGroup("", -99, -99, 1, 1)
Global $Group2 = GUICtrlCreateGroup("Cryptage d'un Texte", 32, 112, 569, 193)
Global $Edit1 = GUICtrlCreateEdit("", 72, 136, 473, 161)
GUICtrlSetData(-1, "Texte")
GUICtrlCreateGroup("", -99, -99, 1, 1)
Global $Group3 = GUICtrlCreateGroup("Cryptage d'un fichier", 32, 312, 569, 65)
Global $Button1 = GUICtrlCreateButton("Parcourir", 56, 336, 113, 25, $WS_GROUP)
GUICtrlCreateGroup("", -99, -99, 1, 1)
Global $Label1 = GUICtrlCreateLabel("Chemin du fichier :", 176, 328, 418, 36)
Global $Group4 = GUICtrlCreateGroup("Options", 224, 16, 377, 89)
Global $Input1 = GUICtrlCreateInput("", 312, 32, 121, 21, BitOR($ES_CENTER,$ES_PASSWORD,$ES_AUTOHSCROLL))
Global $Label2 = GUICtrlCreateLabel("Mot de passe :", 240, 32, 77, 17)
Global $Button2 = GUICtrlCreateButton("Encrypter", 240, 64, 177, 33, $WS_GROUP)
Global $Button3 = GUICtrlCreateButton("Decrypter", 424, 64, 169, 33, $WS_GROUP)
Global $Label3 = GUICtrlCreateLabel("Algorithme :", 440, 32, 59, 17)
Global $Combo1 = GUICtrlCreateCombo("RC4", 504, 32, 89, 25)
GUICtrlSetData(-1, "3DES|AES 128|AES 192|AES 256|DES|RC2")

GUICtrlCreateGroup("", -99, -99, 1, 1)

GUISetState(@SW_SHOW)
While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $Radio1 ; Si on crypte un fichier
                        GUICtrlSetState($Group2,$GUI_DISABLE)
                        GUICtrlSetState($edit1,$GUI_DISABLE)
                        GUICtrlSetState($Group3,$GUI_ENABLE)
                        GUICtrlSetState($Button1,$GUI_ENABLE)
                        GUICtrlSetState($Label1,$GUI_ENABLE)
                Case $Radio2 ; Si on crypte un texte
                        GUICtrlSetState($Group2,$GUI_ENABLE)
                        GUICtrlSetState($edit1,$GUI_ENABLE)
                        GUICtrlSetState($Group3,$GUI_DISABLE)
                        GUICtrlSetState($Button1,$GUI_DISABLE)
                        GUICtrlSetState($Label1,$GUI_DISABLE)
                Case $Button1 ; On choisit un fichier pour le crypter.
                        $SourceFile = FileOpenDialog("TP_cryptage",@ScriptDir&'\',"Tous (*.*)",9)
                        GUICtrlSetData($Label1,"Chemin du fichier : "& $SourceFile)
                Case $Button2 ; Si on clique sur le boutton Encrypter
                        _algo()
                        If _IsChecked($Radio1) Then ; On crypte un fichier
                                If $SourceFile = '' Then
                                        MsgBox(0,"TP_Cryptage",'Veuillez selectionner un fichier')
                                ElseIf _Crypt_EncryptFile($SourceFile,$SourceFile&".crypt",GuiCtrlRead($Input1),$algo) Then
                                        MsgBox(0,"TP_Cryptage",'OK ! , Votre fichier a été crypté')
                                EndIf
                        Else ; On crypte le texte
                                $CryptData = _Crypt_EncryptData(GuiCtrlRead($edit1),GuiCtrlRead($Input1),$algo)
                                GUICtrlSetData($edit1,BinaryToString($CryptData))
                        EndIf
                Case $Button3 ; Si on clique sur le boutton Encrypter
                        _algo()
                        If _IsChecked($Radio1) Then ; On crypte un fichier
                                If $SourceFile = '' Then
                                        MsgBox(0,"TP_Cryptage",'Veuillez selectionner un fichier')
                                ElseIf StringRight($SourceFile,6) <> '.crypt' Then
                                        MsgBox(0,"TP_Cryptage",'Veuillez selectionner un fichier crypté.')
                                ElseIf _Crypt_DecryptFile($SourceFile,StringLeft($SourceFile,StringLen($SourceFile)-6),GuiCtrlRead($Input1),$algo) Then
                                        ;StringLeft($SourceFile,StringLen($SourceFile)-6) Va supprimer le .crypt a la fin de notre nom de fichier. On supprime les 6 derniers caractères.
                                        MsgBox(0,"TP_Cryptage",'OK ! , Votre fichier a été décrypté')
                                Else
                                        MsgBox(0,"TP_Cryptage","OK ! , Votre fichier n'a pas pu être decrypté.")
                                EndIf
                        Else ; On crypte le texte
                                $CryptData = _Crypt_DecryptData(GuiCtrlRead($edit1),GuiCtrlRead($Input1),$algo)
                                GUICtrlSetData($edit1,BinaryToString($CryptData))
                        EndIf
        EndSwitch
WEnd


Func _algo();Definit la variable selon l'algorithme choisi.
                Switch GUICtrlRead($Combo1)
                Case "3DES"
                    $algo = $CALG_3DES
                Case "DES"
                    $algo = $CALG_DES
                Case "RC2"
                    $algo = $CALG_RC2
                Case "RC4"
                    $algo = $CALG_RC4
                Case "AES 128"
                    If @OSVersion = "WIN_2000" Then
                        MsgBox(16, "Error", "Sorry, this algorithm is not available on this system!")
                        $algo = $CALG_3DES
                    EndIf
                    $algo = $CALG_AES_128
                Case "AES 192"
                    If @OSVersion = "WIN_2000" Then
                        MsgBox(16, "Error", "Sorry, this algorithm is not available on this system!")
                        $algo = $CALG_3DES
                    EndIf
                    $algo = $CALG_AES_192
                Case "AES 256"
                    If @OSVersion = "WIN_2000" Then
                        MsgBox(16, "Error", "Sorry, this algorithm is not available on this system!")
                                                $algo = $CALG_3DES
                                        EndIf
                    $algo = $CALG_AES_256
            EndSwitch
EndFunc

;Func _IsChecked($control) --> Retourne 1 si le controle est checké, sinon 0
; On fait une comparaison de Bits entre la variable $GUI_CHECKED Et notre valeur de controle. Si le Bit correspondant à l'état checké vaut 1, alors notre BitAnd va renvoyé 1.
Func _IsChecked($control)
    Return BitAnd(GUICtrlRead($control),$GUI_CHECKED) = $GUI_CHECKED
EndFunc
Voilà une bonne chose de faite. La pratique, il n'y a rien de mieux pour progresser.
J'espère que vous avez essayé de faire ce logiciel seul, c'est pour votre bien ! (Ou pas... :lol: )
Chapitre précédent Sommaire Chapitre suivant

Partager

6 commentaires pour "[TP] Un peu de cryptographie"
Note moyenne : 3.56 / 4 (100 votes)
Pseudo Commentaire
Hors ligne cbourree # Posté le 17/06/2011 à 21:07:34
Avatar

J'aime a voir que le tutoriel n'est pas a l'abandon ! Un logiciel de cryptage, je trouve sa intéressant et j'ai hâte de lire la suite. C'est pourquoi je vous souhait bonne chance pour la suite.
J'ai comme un petit défaut à faire remarquer, le logiciel n'a rien d'intuitif. Je ne comprends pas trop quel sont les différences entre toutes les options mais bon ...
Hors ligne Chiheb2010 # Posté le 19/06/2011 à 10:40:13
dcScript
Avatar

Avis : Très bon
Flux RSS

Ville : Carpentras
Pays : France métropolitaine

Bon tutoriel mais le programme de ctyptographie du dernier chapitre manque à sa tâche : il ne crypte qu'une ligne de texte !!

Image utilisateur Retrouvez dcScript sur mon blog !
 
Hors ligne timmalos # Posté le 19/06/2011 à 11:52:03
Avatar

Avis : Très bon

Études : INSA Lyon

Hmmm pouvez vous m'en dire plus sur cette issue? Je regarderai plus en détails demain pour l'instant je ne peux pas.

Image utilisateur
 
Hors ligne nicolas10150 # Posté le 05/11/2011 à 15:48:04
Avatar

bonjour

après avoir fini le tp de cryptographie qui ma poser asser de problème je me suis dit que j'allais faire le jeux + ou - dans une gui sans le moindre message a l’extérieur de celle-ci mais voila j'ai un magnifique plantage du programe qui a l'aire de rentrer dans une boucle infini si quelqu'un pouvais m'expliquer calmement pourquoi le programme plante
Secret (cliquez pour afficher)
Code : Autre
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

#cs ----------------------------------------------------------------------------

        AutoIt Version : 3.3.6.0
        Auteur:         Malossane Timothée

        Fonction du Script :
        Tutoriel 'La Programmation avec Autoit'
        TP sur les GUIs, Logiciel de cryptage.

#ce ----------------------------------------------------------------------------

Global $Form1 = GUICreate("Form1", 439, 242, 192, 124)
Global $Button1 = GUICtrlCreateButton("jouer", 24, 80, 161, 57)
Global $Button2 = GUICtrlCreateButton("sortir", 232, 80, 163, 57)
Global $bienvenu = GUICtrlCreateLabel("bienvenu", 152, 16, 120, 17, $SS_CENTER)
GUICtrlSetBkColor(-1, 0xFFFFFF)
;-------------------------------------------------------------------------------------
Global $Form2 = GUICreate("Form2", 440, 243, 269, 208)
Global $nombre = GUICtrlCreateInput("entrer le nombre", 32, 120, 121, 21)
Global $Button3 = GUICtrlCreateButton("quitter", 224, 200, 129, 33)
Global $Button4 = GUICtrlCreateButton("ok", 32, 145, 121, 31)
Global $Group1 = GUICtrlCreateGroup("Group1", 24, 104, 145, 89)
GUICtrlCreateGroup("", -99, -99, 1, 1)
Global $valeur = GUICtrlCreateEdit("ZONE", 192, 112, 193, 81)
GUICtrlSetData(-1, "zone de control")

Global $nombreEntrer = 1


GUISetState(@SW_SHOW, $Form1)

While 1
 $nMsg = GUIGetMsg()
 Switch $nMsg
  Case $GUI_EVENT_CLOSE
   Exit
   Case $Button1
           GUISetState(@SW_HIDE,$Form1)
           GUISetState(@SW_SHOW,$Form2)
   Case $Button2
   _fermer()
   case $Button3
   _fermer()
   case $nombre
        _mystere()

 EndSwitch
WEnd

Func _fermer()
        GUISetState(@SW_HIDE, $Form1)
        MsgBox(0,"jeux","au revoir")
        Exit
EndFunc

Func _mystere()
          $chiffreMystere = Random(1,150,1)


Do
     $nombreEntrer = GUICtrlRead($nombre)
         If $nombreEntrer < $chiffreMystere Then
         $valeur = GUICtrlCreateEdit("ZONE", 192, 112, 193, 81)
     GUICtrlSetData(-1, "c'est plus" & $chiffreMystere)
     ElseIf $nombreEntrer > $chiffreMystere Then
         $valeur = GUICtrlCreateEdit("ZONE", 192, 112, 193, 81)
     GUICtrlSetData(-1, "c'est moin" & $chiffreMystere)
     Else
         $valeur = GUICtrlCreateEdit("ZONE", 192, 112, 193, 81)
     GUICtrlSetData(-1, "BRAVO le nombre mystere était bien " & $chiffreMystere)
     EndIf

 Until ($chiffreMystere = $nombreEntrer)
 _fermer()


EndFunc


merci a celui,celle qui m'aidera :euh:
Hors ligne Little Nooby # Posté le 25/03/2012 à 00:05:39
Je cause trop...
Avatar

Avis : Très bon

Ville : Namur
Pays : Belgique

Ca fait toujours du bien un TP pour contrôler. Je me suis contenter du cryptage de texte, vous ne m'en voudrez pas j'espère. En tout cas, j'apprécie très fort ce langage même si ce n'était pas pour les interfaces graphiques que je l'apprends.

Vivement le prochain chapitre, enfin, l'automatisation!

Je ne me trompe jamais, je trouve des façons de ne pas faire ce que je voulais.
 

Voir tous les commentaires
Ce tutoriel a été corrigé par les zCorrecteurs.