• 10 hours
  • Easy

Free online content available in this course.

You can get support and mentoring from a private teacher via videoconference on this course.

Got it!

Last updated on 1/7/13

[TP] Un peu de cryptographie

Log in or subscribe for free to enjoy all this course has to offer!

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

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.

http://www.youtube.com/v/X3uq_QorxdA

Voilà donc une manière de répondre à notre cahier des charges :

#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: )

Ça vous a plu ? Vous en voulez encore ? Ne vous en faites pas, on revient bientôt pour de nouvelles aventures toujours plus excitantes !

Example of certificate of achievement
Example of certificate of achievement