Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les tutoriels > Non-Officiels > Programmation > Algorithmique > Lecture du tutoriel

Les programmes de cryptage et décryptage

Avatar
Auteur : Yruama
Créé : le 21/07/2007 22:17:36
Modifié : le 18/04/2008 16:09:47
Noter et commenter ce tutoriel
Imprimer ce tutoriel
Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Passons dès maintenant à la programmation python ! Si vous pensez que vous allez devoir adopter un serpent, un conseil, rendez-vous ici. :p
Mais si vous avez déjà quelques bases, commençons tout de suite.
Sommaire du chapitre :
Chapitre précédent Sommaire Chapitre suivant

Le programme de cryptage

Pour ce qui est de la programmation python, ne vous inquiétez pas, elle est très intuitive. Tout d'abord il vous faudra installer Python.
Nous travaillerons avec l'IDLE, donc une fois ouvert comme sur l'image, faites : Files > New Window, et nous taperons le code dans cette nouvelle fenêtre.

Déterminer p, q, n et Image utilisateurn :



Entrons dans le vif du sujet ^^ , souvenez-vous pour crypter avec RSA nous avons tout d'abord choisi deux nombres premiers, nous allons donc demander à l'utilisateur d'en choisir deux par le biais de la commande input() :

Il faut savoir qu'en python : on n'utilise pas de ";" et de "{...}" , les parenthèses sont remplacées si je puis dire par l'indentation et les dièses servent à signaler les lignes de commentaires

Code : Python
1
2
3
4
5
# L'utilisateur entre p
p = input('Entrez un grand nombre premier p : ')

# L'utilisateur entre q
q = input('Entrez un grand nombre premier q : ')


Nous demandons donc à l'utilisateur d'entrer p et q, puis nous pouvons calculer n et Image utilisateurn.
Pour ceux qui ont déjà fait du C, vous retrouverez "\n" le retour à la ligne.

Code : Python
1
2
3
4
5
6
7
8
9
# On calcule n 
n = p*q

print "\nn = ",n,

# On calcul phi(n)
phiden = (p-1)*(q-1)

print "\nphi de n = ",phiden,

Pensez à mettre cette ligne à la fin du code, pour que le programme ne se ferme sans avoir vu les résultats. ^^

Code : Python
1
raw_input('\n\nFin\n\n')


Enregistrer et exécuter :



Déjà fatigué :D , alors faisons un petit break pour l'exécution de notre ébauche de programme ! Comment faire ? Bon, je suppose que vous avez tapé le code au fur et à mesure dans la fenêtre "Untitled", alors faites donc : Files > Save as > Nom du fichier : nom_de_votre_fichier.py > Enregistrer.
Vous pouvez ensuite lancer votre .py ou faire F5 et le programme se lancera dans l'IDLE, c'est vous qui choisissez. ^^ Si vous avez des problèmes d'encodage (dus aux accents, etc.), je vous conseille de mettre cette ligne en début de code.
Code : Python
1
# encoding: utf-8

Si les problèmes persistent rendez-vous ici.

Déterminer la clé publique :



Il nous faut trouver e pour créer la clé publique, remémorons-nous comment trouver e :

Nous allons donc faire une boucle qui cherche p,q < e < Image utilisateurn et par-dessus une autre boucle qui continue jusqu'à ce que PGCD de e et Image utilisateurn = 1.

Les variables :


Code : Python
1
2
3
4
5
6
# Variables de la boucle
compteur = 0
PGCD1 = 0

# Notre e qui s'incrémentera
e = 0


La boucle et le if :


Code : Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# Tant que PGCD de e et phi(n) différents de 1
while PGCD1 != 1 :
    # Tant que compteur=0
    while compteur == 0 :   
        # Si p inférieur à e et si q inférieur à e et si e inférieur à n
        if((p < e)and(q < e)and(e < phiden)) : 
            # La boucle se coupe (on peut aussi mettre le mot-clé : break
            compteur = 1     
        # Tant que rien n'est trouvé, e s'incrémente
        e = e + 1
    # On récupère le résultat du pgcd    
    PGCD1 = pgcd(e,phiden)


Une fois que e répond à la première condition, on vérifie s'il est premier avec Image utilisateurn. Pour cela on crée une fonction PGCD qui retourne le PGCD de e et Image utilisateurn.
En Python, une fonction est définie à partir du mot-clé "def". Nous écrirons notre fonction en début de code.

Code : Python
1
2
3
4
5
6
7
8
9
# La fonction PGCD avec ses 2 arguments a et b
def pgcd(a,b):
    # L'algo PGCD
    while a != b:
        if a > b:
            a = a - b
        else:
            b = b - a
    return a;


Maintenant que nous avons tout le nécessaire pour la clé publique, autant l'afficher. :p

Code : Python
1
2
# On affiche notre clé publique
print "\nCle publique (",e,",",n,")"


Crypter



Comme tout à l'heure nous utiliserons une commande pour récupérer le texte que la personne voudra crypter, cette fois ce ne sera pas input() mais une variante, raw_input qui a une différence près : celle-ci prend les lettres.

Code : Python
1
2
# On demande d'entrer le texte à crypter
mot = raw_input('\nEntrez le mot ou la phrase à crypter : ')

Qui se souvient de ce qu'il faut faire après ? hein ? Alors ! personne... Rohh. :p
On va devoir transcrire chaque lettre en son code ASCII, mais comment va-t-on s'y prendre ?
Tout simplement de cette manière :

Bon jusque là pas besoin de travailler à la NSA. ^^
Arrêtons les bavardages et codons.

La taille de la chaîne :


Code : Python
1
2
# On récupère le nombre de caractères du texte.
taille_du_mot = len(mot)


Les variables :


Code : Python
1
i = 0


La boucle :


Code : Python
1
2
# Tant que i inférieur au nombre de caractères
while i < taille_du_mot :

À partir d'ici, tout le code devra être dans la boucle et n'oubliez pas d'indenter, à l'aide de la touche tab.


ASCII :


Avec la fonction ord, nous pouvons très facilement convertir chaque caractère en son code ASCII. Celle-ci prend en argument le caractère à convertir.

Code : Python
1
2
# Comme i s'incrémente jusqu'à égalité avec la taille du mot, à chaque passage dans la fonction chaque lettre sera convertie.
    ascii = ord(mot[i])


Crypter le code ASCII de chaque lettre :


Ahhh enfin on y est ! Aucun changement, ne vous inquiétez pas, le cryptage RSA se fait toujours sous la forme :
bloc ^ e % n

Code : Python
1
2
# On crypte la lettre ou plutôt son code ASCII
    lettre_crypt = pow(ascii,e)%n


Deux dernières petites conditions :


Je ne vais pas vous faire attendre les voilà :
Code : Python
1
2
3
# Si le code ASCII est supérieur à n 
    if ascii > n :
        print "Les nombres p et q sont trop petits veuillez recommencer."

Code : Python
1
2
3
# Si le bloc crypté est supérieur à phi(n)
    if lettre_crypt > phiden :
        print "Erreur de calcul"


Finalisons :
En affichant chaque lettre cryptée et sans oublier d'incrémenter i à la fin de la boucle.

Code : Python
1
2
3
4
5
6
7
8
# On affiche chaque bloc crypté 
    print "\n Block : ",lettre_crypt,
    
    # On incrémente i
    i = i + 1

# On bloque le programme avant la fermeture
raw_input('\n\nFin\n\n')


Et gracieusement je vous donne l'ensemble du code et le programme en python.

Le programme de décryptage

Les quelques notions importantes de python ont été comprises ? Alors, passons tout de suite au décryptage.
La sécurité comme le programme de décryptage repose sur la factorisation de n. Nous allons donc récupérer n puis le factoriser pour obtenir les deux grands nombres premiers p et q.

La fonction de factorisation :


Comme pour le PGCD, on lui envoie n et elle se débrouille pour nous retourner p et q ^^ .

Code : Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# La fonction factoriser avec en argument n
def factoriser(n):
    b=2
    while b:
        while n%b!=0 :
            b=b+1
        if n/b==1 :
            print "p = ", b,
            # On créé une variable globale p pour la réutiliser hors de la fonction et p=b
            global p
            p = b
            break
        print "\nq = ", b,
        # On créé une variable globale q pour la réutiliser hors de la fonction et q=b
        global q
        q=b
        n=n/b;

Vous placez donc la fonction en début de programme, puis nous allons utiliser input() pour demander n et appeler la fonction.

Code : Python
1
2
3
4
5
# On récupère n.
n = input("Entrez le nombre n : ")

# On appelle la fonction pour le factoriser.
factoriser(n)


Déterminer Image utilisateurn, e et d:



Pour Image utilisateurn rien de bien compliqué, comme d'habitude, un petit calcul pour le trouver.

Code : Python
1
2
# On calcule phi(n)
phiden = (p-1)*(q-1)


Nous savons déjà comment trouver e, on utilise le même principe que pour le cryptage.
Comme e est présent dans la clé publique, le code suivant est facultatif, vous pouvez si vous le souhaitez ajouter à la place la commande input() pour récupérer e.


Il va d'abord falloir que vous réécriviez la fonction PGCD en début de code.

Code : Python
1
2
3
4
5
6
7
8
9
# La fonction PGCD avec ses 2 arguments a et b.
def pgcd(a,b):
    # L'algo PGCD
    while a != b:
        if a > b:
            a = a - b
        else:
            b = b - a
    return a;


Et maintenant on récrit la boucle et l'appel du PGCD. Trouver e est très important pour le calcul qui nous permet d'avoir d.

Code : Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# Variable pour notre boucle while
compteur = 0
PGCD1 = 0

# Notre e qui s'incrémentera
e = 0

# Tant que PGCD de e et phi(n) différent de 1
while PGCD1 != 1 :
    # Tant que compteur=0
    while compteur == 0 :   
        # Si p inférieur à e et si q inférieur à e et si e inférieur à n
        if((p < e)and(q < e)and(e < phiden)) : 
            # La boucle se coupe (on peut aussi mettre le mot-clé : break
            compteur = 1     
        # Tant que rien n'est trouvé, e s'incrémente
        e = e + 1
    # On récupère le résultat du pgcd    
    PGCD1 = pgcd(e,phiden)


Voilà nous y sommes, il faut calculer d et nous avons notre clé privée, si vous vous souvenez du premier chapitre :
e*d mod n = 1 et p,q < d < Image utilisateurn.
Comme pour e une boucle et des des conditions.

Code : Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# On calcule d
d = 0
compteur = 0
while compteur == 0:
    # Les conditions vues ci-dessus :
    if((e * d % phiden == 1)and(p < d)and(q < d)and(d < phiden)):
        compteur = 1
    d = d + 1
d = d - 1

# On affiche la clé privée
print "\nCle privee (",d,",",n,")"


Il ne faut pas oublier le cas où ce serait le vrai destinataire qui utiliserait le programme. Tout le code entré jusqu'à présent doit être dans un if, et avant ce if, on demande à l'utilisateur s'il connaît p et q. Soit il ne les connaît pas et on entre dans ce premier if avec la factorisation de n ou soit il les connaît et on a un deuxième if où il rentra p et q non pas n.

Modifiez le code en entrant après les fonctions ces lignes qui permettent de gagner du temps si l'utilisateur est le bon destinataire.

Code : Python
1
2
3
4
pqconnu = 0
pqconnu = input("Si vous êtes en possession de p et q, entrez 1 sinon 0 : ")

if pqconnu == 0 :


Dans ce if on met donc le code du dessus.
Et celui-ci, le cas où nous n'avons pas à faire à un hacker. ^^

Code : Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
if pqconnu == 1 :
    p = input("Entrez le nombre p : ")
    q = input("Entrez le nombre q : ")

    # On calcule n
    n = p*q

    # On calcule phiden
    phiden = (p-1)*(q-1)

    #On demande d
    d = input("Entrez le nombre d : ")


Dans les deux cas on aboutit à d. Seul le deuxième permet de passer la factorisation si l'on connaît p et q. Il n'est pas nécessaire de connaître e car e sert dans le cas où il faut trouver d, ici nous n'en avons pas besoin. Maintenant que d est connu, le décryptage peut réellement commencer.

Décrypter


Tout aussi simple le décryptage, regardons ensemble comment on va s'y prendre : :p
On fait mijoter tout ceci dans la casserole boucle qui va tourner le nombre de fois qu'il y a de lettres, donc ceci c'est nous qui lui disons.

Le nombre de blocs et la boucle :


Code : Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
compteur = 0
# Tant que r inférieur au nombre de lettres
while compteur < i :
    # L'utilisateur entre le premier bloc à décrypter
    lettre_crypt = input("\nEntrez le bloc a décrypter :")
    # On trouve le ASCII de chaque lettre par le calcul de décodage
    ascii = (pow(lettre_crypt,d)%n)
    # Avec la fonction chr(ASCII), on trouve le caractère correspondant.
    print "lettre :",chr(ascii),
    compteur = compteur + 1


Pour exécuter le programme reportez-vous à la première partie, sinon voici le code et le .py. Je vous ai fait aussi une petite démo sur photo. ^^

Eh bien voilà, on l'a fait ce programme ! Pas si dur hein ?
Si l'envie vous prend, sachez que de multiples améliorations sont possibles pour les programmes, comme faire un même programme pour le cryptage et le décryptage, un 2 en 1 ^^ , ou améliorer l'algorithme de factorisation, en bref, libre cours à vos idées...
Par exemple, les 2 programmes avec interface graphique : ici et .
Sinon pour toutes hésitations mathématiques, la partie suivante est là pour vous :p (entièrement rédigée par L01c).
Bonne continuation et à bientôt !
Chapitre précédent Sommaire Chapitre suivant
Auteur : Yruama
Noter et commenter ce tutoriel
Imprimer ce tutoriel

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | Fil RSS | XHTML 1.0 | CSS 2.0
Édité par Simple IT SARL : Nous contacter | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 625 Zéros connectés | Requêtes SQL 10 requêtes | Temps de génération de la page : Total (SQL) 0.0343s (0.0228s)