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).

Répondre

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)?
neuf plus quaranteet un
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.

Retour

Résumé de la discussion (messages les plus récents en premier)

yoshi
03-01-2023 12:40:57

RE,

C'est toi ça :
https://nosdevoirs.fr/devoir/5479391 ?
Si oui, cela porte un nom :
- En anglais : crossposting
- En français : multipostage

Et c'est très mal vu !
Pourquoi s'arrêter à 2 sites dans ce cas ? Il y en a encore d'autres...
Et cela répond à une façon de penser détestable :
Plus j'ai de bénévoles (voire esclaves) qui travaillent pour moi moins j'aurais à passer de temps à attendre pour que quelqu'un ait fait le boulot (à ma place).

Mais c'est donc abuser de l'altruisme de beaucoup de gens divers qui avaient malgré tout peut-être autre chose à faire...

Donc le post sur Nos devoirs est de toi ou pas ?
Si oui, je te laisserai avec eux et fermerai la discussion.

@+

       Yoshi
- Modérateur -

yoshi
02-01-2023 17:13:45

Bonjour,

J'ai ça sous le coude depuis quelques années et même une amélioration de mon cru, ce qui n'avait pas empêché, notre alerte nonagénaire nerosson - spécialiste du chiffrement à l'ancienne - de déchiffrer le texte fourni et dont la clé qu'il avait trouvée (après décryptage !) : n'était pas bonne... Sa clé avait aussi subi mon amélioration de Vigenère.

Vigenère, c'est du passé.

C'est bien de nous expliquer ce qu'est le chiffre de Vigenère, mais en cherchant un peu sur ce site, on trouve cette page  :
https://www.bibmath.net/crypto/index.ph … poly/index

Je veux bien t'aider, mais il faut y mettre du tien...
Qu'as-tu déjà fait ?
Attention : "Rien" n'est pas une réponse valable. Le lien que j'ai mis te donnera matière à réfléchir....
Si tu as déjà produit du code, s'il ne marche pas, il faut le montrer et on regardera ça...
On corrigera !

Sinon, cette discussion (qui date de Python 2.5, on en est à la version 3.11) contient du code Vigenère...

@+

marioooo
02-01-2023 15:32:15

bonjour, j'ai besoin d'aide
Une amélioration du chiffre de César est le chiffre de Vigénère. Il ne s’agit
plus d’un chiffrement mono-alphabétique (chaque lettre est remplacée par une
autre lettre), mais un chiffrement poly-alphabétique (une lettre peut être rem-
placée par plusieurs lettres différentes selon sa place dans le message initial.)
Faire quelques recherches sur internet concernant cette méthode
Programmer une fonction en python qui prend
en paramètre une première chaîne de carac-
tère (la «clé»), une autre chaîne de caractères
(le «message»), et qui rend la version chiffrée
de cette chaîne de caractère par le code de Vi-
genère avec la clé indiquée

yoshi
04-03-2009 18:20:35

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 ?

@+

Lutcho74
04-03-2009 17:50:24

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

@+

yoshi
04-03-2009 16:39:04

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...

@+

Lutcho74
04-03-2009 15:03:00

Salut Yoshi,

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

Merci d'avance

@+

yoshi
03-03-2009 18:53:45

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

@+

Lutcho74
02-03-2009 21:01:53

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)

@+

Pied de page des forums