Objectifs de certification


1. Algorithmes de chiffrement faible (facilement déchiffrables)

Les premiers algorithmes utilisés pour le chiffrement d’une information étaient assez rudimentaires dans leur ensemble. Ils consistaient notamment au remplacement de caractères par d’autres. La confidentialité de l’algorithme de chiffrement était donc la pierre angulaire de ce système pour éviter un décryptage rapide.

Exemples d’algorithmes de chiffrement faibles :

  • ROT13 (rotation de 13 caractères, sans clé) ;
  • Chiffre de César (décalage de trois lettres dans l’alphabet sur la gauche).
  • Chiffre de Vigenère (introduit la notion de clé)

Pour s’amuser avec ces algorithmes vous pouvez vous référer aux sites https://asecuritysite.com/ ou http://www.cryptool-online.org/ ou encore, parmi d’autres ressources, la libraire python pycipher : http://pycipher.readthedocs.io/en/master/.

2. Projet traducteur de langage Geek (Python 3)

2.1. Objectif

Programme qui traduit une phrase ou un mot en langage geek.

2.2. Dictionnaire

dico={"A":"4","B":"8","C":"(","D":"d","E":"3","F":"f","G":"6","H":"#","I":"1","J":"j","K":"k","L":"1","M":"m","N":"n","O":"0","P":"p","Q":"q","R":"2","S":"5","T":"7","U":"u","V":"v","W":"w","X":"x","Y":"y","Z":"z"}

2.3. Résultat attendu

./parler-geek.py
entrez votre phrase
Vous parlez geek ?
v0u5 p4213z 633k

2.4. En pratique

  • Boucle while
  • Dictionnaire

2.5. Références

2.6. Solutions

#!/usr/local/bin/python3
#--*-- coding:utf8 --*--
"""
Programme qui traduit une phrase ou un mot en langage geek.
Traducteur : https://github.com/floft/leetspeak
Leet speak : https://fr.wikipedia.org/wiki/Leet_speak
"""
dico={"A":"4","B":"8","C":"(","D":"d","E":"3","F":"f","G":"6","H":"#","I":"1","J":"j","K":"k","L":"1","M":"m","N":"n","O":"0","P":"p","Q":"q","R":"2","S":"5","T":"7","U":"u","V":"v","W":"w","X":"x","Y":"y","Z":"z"}
message_clair=input("entrez votre phrase\n")
msg=message_clair.upper()
i=0
while i<len(msg):
    for cle,valeur in dico.items():
        if cle==msg[i]:
            print(valeur,end="")
        elif msg[i]==" ":
            print(" ",end="")
            break
    i=i+1
print("\n")

Plus élégant (Émilie Pasteur)

#!/usr/local/bin/python3
#--*-- coding:utf8 --*--

dico={"A":"4","B":"8","C":"(","D":"[)","E":"3","F":"|=","G":"6","H":"#","I":"1","J":"_|","K":"|<","L":"£","M":"|v|","N":"|v","O":"0","P":"|*","Q":"()_","R":"2","S":"5","T":"7","U":"|_|","V":"\/","W":"\/\/","X":"><","Y":"'/","Z":"~/_"}
message=input("Entrez votre texte a traduire: \n").upper()
for key,value in dico.items():
    message=message.replace(key,value)
print(message)
print("\n")

3. Projet Vigenere (Python 3)

3.1. Objectif

Chiffrer grâce à l’algorithme de Vigenère un texte écrit dans un fichier “messageclair.txt” et écrire ce résultat dans un autre fichier texte “messagechiffre.txt”.

3.2. ROT13

Décalage de chaque lettre de 13 vers la droite dans l’alphabet. Si les lettres de l’alphabet sont numérotées de 0 à 25, il s’agirait d’ajouter 13 à leur rang et de s’assurer qu’il reste compris entre 0 et 25 avec le modulo 26.

Chiffré avec ROT13, le mot « HELLO » devient « URYYB » (et inversement).

Peut-être plus simplement en python 2 :

import string
rot13 = string.maketrans(
    "ABCDEFGHIJKLMabcdefghijklmNOPQRSTUVWXYZnopqrstuvwxyz",
    "NOPQRSTUVWXYZnopqrstuvwxyzABCDEFGHIJKLMabcdefghijklm")
string.translate("Hello World!", rot13)
# 'Uryyb Jbeyq!'

Et en python 3 :

rot13 = str.maketrans(
    "ABCDEFGHIJKLMabcdefghijklmNOPQRSTUVWXYZnopqrstuvwxyz",
    "NOPQRSTUVWXYZnopqrstuvwxyzABCDEFGHIJKLMabcdefghijklm")
"Hello World!".translate(rot13)
#'Uryyb Jbeyq!'
import string

Source

3.3. Algortithme de Vigenère

Pour casser le code Rot13 il suffit de tester les 26 décalages possibles. L’algortithme de Vigenère consiste à introduire une clé rendant le décalage variable selon la position du caractère dans le message.

Message clairciscosystems
n# du message clair28182141824181941218
Clé répétéeabcdabcdabcd
n# de clé (décalage)012301230123
Résultat n# + n#2920514190211951421
Message chiffrécjufotavtfov
echo "ciscosystems" > messageclair.txt

3.4. Résultat attendu

if [ -f messagechiffre.txt ] ; then rm messagechiffre.txt ; fi ; ./vigenere.py && cat messagechiffre.txt ; echo " "
Entrez la cle de chiffrement
abcd
cjufotavtfov

3.5. En pratique

  • Opérations arithmétiques
  • manipulation de fichier
  • créer automatiquement une plage de nombres, de lettres
  • commentaires et documentation
  • Mise en fonction
  • Fonction native ord() et chr()
  • Boucle for
  • Fonction range()

3.6. Références

3.7. Solution

Fichier messageclair.txt

ciscosystems

Script :

#!/usr/local/bin/python3
#--*-- coding:utf8 --*--
"""Ce script va nous permettre de chiffrer grace a l'algorithme de vigenere une
phrase qui se trouvera dans un fichier texte
Le resultat du chiffrement se trouvera dans un autre fichier texte"""
# demande de la clef de chiffrement
clef=input('Entrez la cle de chiffrement\n')
# lecture du fichier messageclair.txt
fichier=open('messageclair.txt','r')
texteclair=fichier.read()
fichier.close()
# initialisation du texte chiffre textechiffre=' '
textechiffre=''
# chiffrement selon l'algorithme de vigenere
for i in range(0,len(texteclair)): # parcours de la phrase lettre par lettre
    if 97<=ord(texteclair[i])<=122: # si la lettre est comprise entre a et z ascii
        caractere=texteclair[i] # récupère le caractere dans la variable
        #print(caractere)
        code=ord(caractere)-97 # le caractere est positionne dans l'alphabet
        #print(code)
        decalage=ord(clef[i%len(clef)])-97 # calcul du decalage modulo longueur cle
        #print(decalage)
        codechiffre=(code+decalage)%26 # code + decalage sans dépasser 25
        #print(codechiffre)
        caracterechiffre=chr(codechiffre+97) # code ascii
        #print(caracterechiffre)
        textechiffre=textechiffre+caracterechiffre # fabrication du texte chiffre
        #print('\n')
    else:
        textechiffre=textechiffre+' ' # un caractere qui n'existe pas est remplace par un espace
# ecriture dans le fichier messagechiffre.txt
fichier=open('messagechiffre.txt','w')
fichier.write(textechiffre)
fichier.close()

Fichier messagechiffre.txt

cjufotavtfov

Laisser un commentaire