Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 02-03-2009 20:01:53

Lutcho74
Membre
Lieu : Vitrolles
Inscription : 22-12-2008
Messages : 136
Site Web

[Python] Cryptage par le carré de Vigenère

Salut,

Bon pour l'instant je n'ai fait que le code de cryptage et dès que j'aurais le temps je ferai celui de décryptage...
Par contre si quelqu'un a des idées pour le simplifier et/ou l'optimiser je suis preneur.

Voilà le code de cryptage:

# -*- coding: cp1252 -*-
messageacrypter="bonjour comment ca va"
cl="truc"
messageacrypter=messageacrypter.upper()
cle=cl.upper()
lg_m=len(messageacrypter)
lg_c=len(cle)
key=""
lg_r=lg_m-lg_c
if lg_c<lg_m:
    for e in range(lg_r):
        key+=cle


###ABCDEFGHIJKLMNOPQRSTUVWXYZ##
a="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
b="BCDEFGHIJKLMNOPQRSTUVWXYZA"
c="CDEFGHIJKLMNOPQRSTUVWXYZAB"
d="DEFGHIJKLMNOPQRSTUVWXYZABC"
e="EFGHIJKLMNOPQRSTUVWXYZABCD"
f="FGHIJKLMNOPQRSTUVWXYZABCDE"
g="GHIJKLMNOPQRSTUVWXYZABCDEF"
h="HIJKLMNOPQRSTUVWXYZABCDEFG"
i="IJKLMNOPQRSTUVWXYZABCDEFGH"
j="JKLMNOPQRSTUVWXYZABCDEFGHI"
k="KLMNOPQRSTUVWXYZABCDEFGHIJ"
l="LMNOPQRSTUVWXYZABCDEFGHIJK"
m="MNOPQRSTUVWXYZABCDEFGHIJKL"
n="NOPQRSTUVWXYZABCDEFGHIJKLM"
o="OPQRSTUVWXYZABCDEFGHIJKLMN"
p="PQRSTUVWXYZABCDEFGHIJKLMNO"
q="QRSTUVWXYZABCDEFGHIJKLMNOP"
r="RSTUVWXYZABCDEFGHIJKLMNOPQ"
s="STUVWXYZABCDEFGHIJKLMNOPQR"
t="TUVWXYZABCDEFGHIJKLMNOPQRS"
u="UVWXYZABCDEFGHIJKLMNOPQRST"
v="VWXYZABCDEFGHIJKLMNOPQRSTU"
w="WXYZABCDEFGHIJKLMNOPQRSTUV"
x="XYZABCDEFGHIJKLMNOPQRSTUVW"
y="YZABCDEFGHIJKLMNOPQRSTUVWX"
z="ZABCDEFGHIJKLMNOPQRSTUVWXY"
tout=[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]
messagecrypter=""
for i in range(lg_m):
    caract_m=messageacrypter[i]
    caract_c=key[i]
    asc_m=ord(caract_m)
    asc_c=ord(caract_c)
    if caract_m==" ":
        caractcode=" "
    elif asc_m>=65 or asc_m<=90 and asc_c>=65 or asc_c<=90:
        deca_m=asc_m-65
        deca_c=asc_c-65
        deca_tout=tout[deca_c]
        caractcode=deca_tout[deca_m]
        caractcode=chr(ord(caractcode))
    messagecrypter+=caractcode

print "Le message qui était a crypter :"
print messageacrypter
print ""
print "La clé : "
print cl
print ""
print "Le message crypter :"
print messagecrypter

Tout les commentaires sont évidement les bienvenue

Pour savoir comment fonction le carré de Vigenère, voici un applet de Fred : http://www.bibmath.net/crypto/poly/vigaction.php3
mais par contre son applet ne donne pas le même résultat que mon programme car il prend la colonne de gauche pour le message en claire et la ligne du haut pour la clé (moi l'inverse)

@+

Dernière modification par Lutcho74 (03-03-2009 15:25:37)


La seule façon raisonnable de vivre en ce bas monde, c'est en dehors des règles.

Hors ligne

#2 03-03-2009 17:53:45

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 13 668

Re : [Python] Cryptage par le carré de Vigenère

Bonsoir,

Ma version :

#!/usr/bin/env python
# -*- coding: Latin-1 -*-

def prepare(TexteClair):
    li1=["âà","éèêë","îï","ô","ûü","ç"]
    li2=["A","E","I","O","U","C"]
    i=0
    # Remplacement des caractères accentués éventuels
    for mot in li1:
       repl=li2[i]
       for lettre in mot:
           TexteClair=TexteClair.replace(lettre,repl)
       i+=1      
    for lettre in "',-;:!?.":   # Suppression des signes de ponctuation
        TexteClair=TexteClair.replace(lettre,"")
    TexteClair=TexteClair.upper()    # Passage en majuscules
    return TexteClair

# Construction du carré de Vigenère
Carre=[]
ligne=[]
for j in range(26):
    for i in range(26):
        ligne.append(chr(65+(i+j)%26))
    Carre.append(ligne)
    ligne=[]

# Initialisation des données    
TexteClair="Cet algorithme de cryptographie est très facile d'utilisation,  et le décryptage tout aussi aisé si on connait la clé"
TexteClair=prepare(TexteClair)
lg_tc=len(TexteClair)
Cle="VICTORHUGO"
lg_C=len(Cle)
bl=0                   # stockage du nombre d'espaces
TexteCrypte=""

# Cryptage
for i in range(lg_tc):
    lettre=TexteClair[i]
    if lettre==" ":
        bl+=1
        TexteCrypte+=" "
    else:
        j=(i-bl)%lg_C
        j=ord(Cle[j])-65
        h=ord(lettre)-65
        TexteCrypte+= Carre[h][j]

# Affichages
print "             Texte de départ :"
print TexteClair
print
print "             Clé :"
print Cle
print
print "             Texte crypté :"
print TexteCrypte

# Résultat :
# XMV TZXVLOHCUG WS TYSVHJOTTDYPY KGO BTXG WHWOZZ LWMWCPMGHDWP XH CL XKQMGRMOXL NUIO IWLGZ HCYS NQ QG QFUHGWO TC VZV

A vérifier dans un sens ou dans l'autre avec l'applet Java de  BibM@th :
http://www.bibmath.net/crypto/poly/cryptvig.php3

Décodage :

#!/usr/bin/env python
# -*- coding: Latin-1 -*-

Carre=[]
ligne=[]
for j in range(26):
    for i in range(26):
        ligne.append(chr(65+(i+j)%26))
    Carre.append(ligne)
    ligne=[]
   
TexteClair=""
Cle="VICTORHUGO"
lg_C=len(Cle)
bl=0
TexteCrypte="ZB UBZ EF U VON LJBJVY WKZV VGLH GHM RSOM NT DCBCK SNB VKOMLLYWZZG XZCL VGH YM IKOZU YT UMIKG"
lg_tc=len(TexteCrypte)
for i in range(lg_tc):
    lettre=TexteCrypte[i]
    if lettre==" ":
        bl+=1
        TexteClair+=" "
    else:
        j=(i-bl)%lg_C
        j=ord(Cle[j])-65
        for l in range (26):
            if Carre[l][j]==lettre:
                TexteClair+= Carre[l][0]

print "             Texte crypté :"
print TexteCrypte
print
print "             Clé :"
print Cle
print
print "             Texte clair :"
print TexteClair
# Résultat :
# ET SIL NY A PAS DHIVER CELA NEST PAS LETE LA PLUIE EST TRAVERSIERE ELLE BAT DE GRAIN EN GRAIN

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#3 04-03-2009 14:03:00

Lutcho74
Membre
Lieu : Vitrolles
Inscription : 22-12-2008
Messages : 136
Site Web

Re : [Python] Cryptage par le carré de Vigenère

Salut Yoshi,

Pourrais tu stp expliquer tes deux codes par "étapes" et à quoi sert les deux fonctions ?

Merci d'avance

@+


La seule façon raisonnable de vivre en ce bas monde, c'est en dehors des règles.

Hors ligne

#4 04-03-2009 15:39:04

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 13 668

Re : [Python] Cryptage par le carré de Vigenère

Salut,

Alors
A.- Codage
1. def prepare(TexteClair)
   * Je commence par rechercher si les "caractères spéciaux" des mots "âà","éèêë","îï","ô","ûü","ç" sont compris dans mon texte clair. Si oui, je remplace l'un ou l'autre des caractères du 1er "mot" par A, l'un ou l'autre des caractères du 2e "mot" par E... etc
   * Je continue en recherchant la présence de l'un des caractères de "',-;:!?." que je remplace par le vide "" : c'est donc une suppression.
   * Cela fait, je passe tout en majuscules

2. Construction du carré de Vigenère.
    * Il comprend 26 lignes (gérées avec l'index j) de 26 colonnes (gérées par l'index i)
    * Je génère une (ligne) liste de 26 caractères de code ASCII compris entre 65 et 90 : j'avance de 1 numéro par colonne mais aussi par ligne. Ligne 7 (donc la 8e, python commençant à 0) colonne 21 (donc la 22e), le code serait 65 + 7+ 21 = 65 +28. mais je ne peux pas ajouter plus de 25 (65 + 25 = 90 --> code de Z) : à 26 je retourne à 0. D'où le (i+j)%26 --> 28%26 = 2 donc code 65 + 2 = 67 et chr(67) --> C.
Regarde dans ton tableau : la lettre à l'intersection de la 8e ligne (celle de H) et de la 22e colonne (celle de V) : tu y trouveras bien C..
C'est juste un petit tour de passe-passe réalisé parce que ça m'ennuyait de taper comme tout le monde un "tableau" de 26 x 26. ;-)
  * Ensuite je crée un tableau carré (une liste de 26 listes de 26 caractères) en ajoutant (append) 26 lignes les unes après les autres... Je dois vider chaque liste au début de chaque nouveau tour.

B.- Initialisation
     Je vais juste affecter une variable au stockage du nombre d'espaces : bl

C.- Cryptage (Ca n'a marché qu'après 1/4 h de débogage après la fin de l'écriture du script).
   * Je parcours avec i le texte clair lettre par lettre
   * Si la lettre est un espace, j'augmente bl de 1 et j'ajoute un espace dans le texte codé.
   * Si ce n'est pas une espace, ma clé faisant 10 lettres, toutes les 10 lettres je dois revenir à la première le V de VICTORHUGO : encore une histoire de cycle donc de reste dans la division euclidienne, donc de modulo... A la valeur de i, je retranche le nombre de blancs puisque j'ai avancé de i places mais en réalité de i-bl caractères. J'applique donc (i-bl)%lg_C.
  * Je ne gère pas des lettres, mais des lignes et des colonnes. j est le n° de la lettre de la clé à utiliser en face de la lettre du texte. Pour connaître la colonne du carré sur laquelle se trouve cette lettre, je prends son code ASCII et je lui enlève 65. Exemple V code 86, moins 65  --> 21 le V est sur la 21e colonne
La 1re lettre du texte est un C code 67. 67 -65 = 2 la lettre C est sur la ligne n°2 (donc la 3e).
A l'intersection de la ligne n°2 et de la colonne n°21 se trouve le caractère à l'emplacement Carre[2][21] : liste n°2, caractère n°21 de cette liste. C'est le X...

Pour le cryptage, j'ai suivi à la lettre les explications données ici :http://www.bibmath.net/crypto/poly/vigenere.php3.

Bon, est-ce suffisant ?
Si nécessaire j'expliquerai aussi le décodage mais, j'ai suivi aussi les instructions et ça a été vite fait (même si s'il a fallu 5 min de débogage) : c'est le + simple...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#5 04-03-2009 16:50:24

Lutcho74
Membre
Lieu : Vitrolles
Inscription : 22-12-2008
Messages : 136
Site Web

Re : [Python] Cryptage par le carré de Vigenère

Re,

C'est juste un petit tour de passe-passe réalisé parce que ça m'ennuyait de taper comme tout le monde un "tableau" de 26 x 26.

J'avais pensé a faire un "tableau" avec du code mais je ne voyais pas trop comment donc j'ai laissé tomber et je me suis résolu à faire le tableau "à la main"
Mais je ne comprend pas lorsque tu modifie les caractère (ÏÎ,ÄÂ etc..) la variable lettre à quoi elle correspond (bon je sais cette variable correspond au caractère spéciaux mais comment ? ) ?
Merci pour ces explications :-)

@+

Dernière modification par Lutcho74 (05-11-2009 15:58:26)


La seule façon raisonnable de vivre en ce bas monde, c'est en dehors des règles.

Hors ligne

#6 04-03-2009 17:20:35

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 13 668

Re : [Python] Cryptage par le carré de Vigenère

Bonsoir


Si on écrit  simplement :

li1=["âà","éèêë","îï","ô","ûü","ç"]
for mot in li1:
     print mot

on obtient :
âà
éèêë
îï
ô
ûü
ç

Il faut repérer chaque mot avec un index qui est i et qui part de 0.
Le caractère de remplacement qui sera stocké dans la variable repl, figure dans la liste li2=["A","E","I","O","U","C"]  de même longueur que li1 et dans le  même ordre.
Ainsi :
* Pour lettre dans "âà"       --> repl ="A"
* Pour lettre dans "éèêë"   --> repl = "E"
* Pour lettre dans "îï"         --> repl = "I"
* Pour lettre dans "ô"        --> repl = "O"
* Pour lettre dans "ûù"      --> repl = "U"
* Pour lettre dans "ç"        --> repl ="C"

Le remplacement c'est le boulot de  TexteClair=TexteClair.replace(lettre,repl), puis à chaque "mot", j'ajoute 1 au compteur ce qui permet de trouver repl = li2[i].
Exemple : lorsque je lis le 2e mot "éèêë", il correspond à i = 1, et il comprend 4 lettres.
Je passe en revue chacune des 4 (c'est le boulot de : for lettre in mot) et je dis que je remplace par li2[1], soit E...
Et s'il elle ne figure pas dans le texte ? Aucune importance, c'est l'avantage de la méthode replace() qui n'agit pas dans ce cas et ne déclenche pas de message d'erreur... Bon on aurait pu tester avec if si la lettre figurait ou non dans le texte...

C'est plus clair ?

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

Réponse rapide

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
quaranteneuf plus soixante sept
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Pied de page des forums