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 05-11-2009 23:20:14

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

[Python] Modulo clé pour crypter

Salut,

Voilà j'ai repris tout les algos que je ne pensait pas très acquis et j'ai essayer de les refaire (César,Polybe...) et j'ai essayé masque jetable et Vigenère...je n'arrive pas(ou je ne doit pas suffisement me creuser la tête) à trouver pour que si ma clé c'est qu'un seul lettre et bin qu'elle me crypte quand même....en bref à faire un style de modulo...

Yoshi, je sais que tu m'a aidé pour les script et tout mais ta technique et imbriqué dans le paysage de l'algo et je suis perdu...

Merci d'avance pour l'aide...

@+


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

Hors ligne

#2 06-11-2009 08:39:18

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

Re : [Python] Modulo clé pour crypter

Salut Lutcjho,

Tu dois être très perturbé parce qu'avec tes explications, je n'ai pas compris
1. quel était exactement ton problème :

ta technique et imbriqué dans le paysage de l'algo

??? Et en français ça veut dire quoi ? :-)
2. Ce que tu attendais de moi
3. Sur quel type de chiffrage tu voulais travailler (et à partir de quoi)

Si tu veux reprendre la programmation du carré de Polybe, par exemple, à mon avis rien de mieux que de réécrire l'algo en "pseudo-code" (=avec les instructions en français, comme si tu donnais des ordres à la machine).
Bon non reprend quelle méthode de chiffrage : Cesar ? Vigenère ? Che Guevarra ? Affine ?...


@+

PS

Pas sérieux, Lutcho : à cette heure-là tu devrais être couché pour être frais le lendemain en classe !


Arx Tarpeia Capitoli proxima...

Hors ligne

#3 08-11-2009 13:24:34

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

Re : [Python] Modulo clé pour crypter

Salut,

1- Le problème j'ai un message de 10 lettre et un clé de 5 et mon algo c'est Vigénere...
2- ce que j'attend de toi : que tu m'explique s'il te plait  comment fonctionne ton modulo que tu a appliqué au code de Vigénre et de masque jetable dans le forum.
3- Vigénere

Le carré de polybe je l'ai déjà refait le truc c'est que j'essaye de refaire ceux auxquelles je t'ai demandé de l'aide...pour voir si je peut y arriver sans toi et sans regarder les anciens codes...j'ai réussi a créer le carré de Vigénère a ma façon mais je n'arrive pas a voir comment faire un peu comme "un modulo" de la clé pour pouvoir crypter...

@+

PS: Tu a raison j'aurais du me coucher plus tôt...je pensais qu'en commençant à 10 h ce n'était pas grave, résultat je me suis levé à 10h15 au lieu de 9h15...en tout cas j'étais frai pour la seule heure de la matinée ^^"


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

Hors ligne

#4 08-11-2009 17:28:12

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

Re : [Python] Modulo clé pour crypter

Salut

1. Construction et stockage du carré de Vigenère.
    J'utilise une liste (nommée Carre) contenant 26 listes de 26 lettres chacune.
    Afin que la ligne en cours ne s'ajoute pas à la présente, au départ de chacune des 26 lignes, j'écris ligne=[]
    Chaque lettre de chaque ligne est décalée de 1 par rapport à la lettre qui la précède...
    Donc dans chaque ligne, je gère chaque lettre avec une boucle qui va de 0 à 25.
Pour la 1ere ligne :

for i in range (26):
    ligne.append(chr(65+i))

Jusque là, rien d'anormal, on va bien de A à Z
  Ca se gâte pour la 2e ligne dont la première lettre est décalée de 1 par rapport à la première lettre de la 1ere ligne, et dont chaque lettre de cette ligne est ensuite également décalée de 1 par rapport à la précédente ! IL me faut donc 2 boucles : 1 qui contrôle les lignes, l'autre qui contrôle les colonnes :

for j in range(26):
    ligne=[]
    for i range (26):
        ligne.append(chr(65+i+j))

Si tu fais varier j de 0 à 25, i étant égal à 0, la premières lettre de chaque ligne est successivement A, B...Z
Mais il y a un problème dès la fin de la 2e ligne et dès le 2e caractère de la 26e ligne.
En effet 2e ligne : j = 1, 26e caractère : i =25,  65+ i+j = 91
Et       26e lligne : j =25, 2e caractère : i = 1n   65 + i +j = 91...
Le problème est qu'on devrait retourner à 65 parce que chr(90)= "Z", chr(65)="A" mais chr(91) ="[".
Donc dès que i + j dépasse 25, on a un problème... on dit avoir 26 --> 0, 27 --> 1, 28 --> 2
Bin la fonction qui fait ça simplement c'est % 26 (modulo 26, c'est le reste dans la division par 26).
D'où l'écriture de :

for j in range(26):
    ligne=[]
    for i in range(26):
        ligne append(chr(65+(i+j)%26)
    Carre.append(ligne)

2. Codage avec un mot clé. On va supposer que le texte à coder est "propre" : plus d'accents, de ponctuation, tout en majuscules :
TexteClair="CODAGE SELON LE CARRE DE VIGENERE"
lg_tc=len(TexteClair)  # Longueur du texte à coder... avec les blancs (les espaces)
Cle = "LUTCHO"
lg_c = len(Cle)  # Longueur de la clé
Je vais utiliser une variable j pour parcourir tous les caractères du TexteClair de 0 = à lg_tc -1, ce qui se traduire par :
for in range(lg_tc):

Il faut bien penser que ta clé va s'appliquer ainsi  :

CODAGE SELON LE CARRE DE VIGENERE
LUTCHO LUTCH OL UTCHO LU TCHOLUTC

Dès que tu atteins le O, la 6e lettre de ta Clé, tu reviens à la première...
Donc tes lettres de ta clé ont un n°d'orde de 0 à 5, dès que tu passes à la 7e lettre de n° d'ordre 6, tu dois revenir à la lettre n°  de ta clé. Conclusion, on va utiliser % 6 !

MAIS, si je gère les espaces, par contre je ne les code pas...
J'extrais la 7e lettre de la phrase, soit TexteClair(6). C'est une espace. J'ajoute 1 à bl, j'ajoute une espace à TexteCrypte, et je refais un tour...

TexteClair(7) = "S" (le 8e caractère de la phrase). Ce n'est pas une espace. Je code !
Mais c'est seulement en réalité la 7e lettre même si c'est le 8e caractère, parce qu'il y avait juste avant une espace.
Je gère le n° d'ordre de la lettre de la clé avec la variable j.
j = 7 - bl = 7 - 1 = 6 n° d'ordre 6 (de 0 à 6, on en a bien 7. Les listes commencent à 0).
Mais si je demande Cle[6], j'obtiens un message d'erreur : IndexError: string index out of range.
Index hors limite... Bien sûr in ne peut demander que Cle[0], Cle[1], Cle[2], Cle[3], Cle[4] et Cle[5].
Il faut revenir à 0, d'où j = (7 - bl)%6.
Ce qui te donne la lettre de la clé à sélectionner et à mettre en face de la lettre correspondante du texte.
MAIS deux questions :
- Quel est le n° d'ordre dans, l'Alphabet, de la lettre du TexteClair ? Réponse : h = ord(lettre) - 65
- Quel est le n° d'ordre dans l'Alphabet, la la lettre de la Clé correspondante ? Réponse : k = ord(Cle[j])-65
h te donne le n° de ligne dans le carré, k le n° de colonne.
Pour S => h = ord("S") - 65 = 83-65 = 18
Pour L =>  k = ord("L") - 65 = 76 - 65 = 11
Donc la lettre du TexteCrypté sera Carre[18][11] = "D".

Script débarrassé du "superflu" :

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

# 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="CODAGE SELON LE CARRE DE VIGENERE"
lg_tc=len(TexteClair)
Cle="LUTCHO"
lg_C=len(Cle)
bl=0                   # variable pour 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
        k=ord(Cle[j])-65
        h=ord(lettre)-65
        TexteCrypte+= Carre[h][k]

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

Résultat :

Texte de départ :
CODAGE SELON LE CARRE DE VIGENERE

             Clé :
LUTCHO

             Texte crypté :
NIWCNS DYEQU ZP WTTYS OY OKNSYYKG

Des questions ? Sinon, on passera au décodage..

@+


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)?
cinquante deux plus quatre-vingt six
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