Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#1 10-01-2013 17:18:39
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 991
[Python] Codage/décodage "Chiffre de Beaufort"
Bonjour à tous,
Suite aux éclaircissements - définitifs - apportés pour ce message, j'ai écrit un petit programme de codage/décodage (puisque le système est réversible) de tout message.
#!/usr/bin/env python
# -*- coding: Latin-1 -*-
def prepare(PhraseDepart):
li1=["âà","éèêë","îï","ô","ûü","ç"]
li2=["A","E","I","O","U","C"]
# Remplacement des caractères accentués éventuels
for i,mot in enumerate(li1):
repl=li2[i]
for lettre in mot:
PhraseDepart=PhraseDepart.replace(lettre,repl)
for lettre in " ',-;:!?. ": # Suppression de la ponctuation et des espaces
PhraseDepart=PhraseDepart.replace(lettre,"")
PhraseDepart=PhraseDepart.upper() # Passage en majuscules
return PhraseDepart
Cle="COMPLEXE"
LongCle=len(Cle)
MessageTraite=""
alpha=[chr(65+i) for i in xrange(26)]
PhraseDepart="XKBHJ WEEJG YCTJJ KKORL MNTKK WEPIA VXUJH YHNVA AAJLQ QDMJX\
YVQAG ADDIE DADAJ DMNLC QACUP NXQGB OBZLH MFKUT MCSAF ROXJN DRHKC BTLIA\
RNYWW VLNXR JKKHY OIQUB TXDHV APVZL RZTLY WTMHK ABYIV LTJPR WVJLR HIQUB\
TNDRH CYBTZ REGEP VIZREE NYNYC YAVXC WUL"
# Les \ ci-dessus permettent d'étaler le texte sur plusieurs lignes
MessageDepart=PhraseDepart # Je garde la trace du message d'origine avant retouches
PhraseDepart=prepare(PhraseDepart)
LongPhraseDepart=len(PhraseDepart)
for i,lt in enumerate(PhraseDepart):
ecart= (ord(Cle[i%LongCle])-ord(lt))%26
MessageTraite+=alpha[ecart]
print
# Préparation du message de sortie en groupes de 5 lettres séparés par une espace
Coupes=LongPhraseDepart/5-(LongPhraseDepart%5==0)
for i in range(Coupes):
# Ci-dessous l'équivalent de LongPhraseDepart=LongPhraseDepart+1
LongPhraseDepart+=1
print " Message d'origine :" # non modifié
print MessageDepart
print
print " Message traité :"
print MessageTraite
Résultat :
Message d'origine :
XKBHJ WEEJG YCTJJ KKORL MNTKK WEPIA VXUJH YHNVA AAJLQ QDMJXYVQAG ADDIE DADAJ DMNLC QACUP NXQGB OBZLH MFKUT MCSAF ROXJN DRHKC BTLIARNYWW VLNXR JKKHY OIQUB TXDHV APVZL RZTLY WTMHK ABYIV LTJPR WVJLR HIQUBTNDRH CYBTZ REGEP VIZREE NYNYC YAVXC WULMessage traité :
FELIC ITATI ONSVO USAVE ZREUS SIADE CHIFF RERCE CODEV OUSTR OUVER EZLEL IEUET LACAC HEAUX COORD ONNEE SSUIV ANTES NORDC INQUA NTEDE GRESQ UARAN TECIN QPOIN TSIXC ENTNE UFETE STDEU XDEGR ESVIN GTDEU XPOIN TCINQ CENTQ UARAN TEQUA TREBO NNECH ASSE
Ainsi qu'expliqué par Fred ici, sans modifications, mettre le code obtenu en sortie à la place de la phrase de départ permet de retouver le message codé.
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#2 11-01-2013 22:37:40
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 991
Re : [Python] Codage/décodage "Chiffre de Beaufort"
RE,
Procéder par input me demanderait pour "faire propre" un traitement d'erreurs... et rallongerait le code : je n'en ai pas eu envie.
Voilà avec une ligne de code en plus, qui vous permettra d'utiliser le "Chiffre de Beaufort" :
- variante "normale". J'ai ajouté le "témoin" Variante : le mettre à 1 : Variante = 1
- variante "allemande". Mettre le "témoin" Variant à -1 : Variante = -1
La raison
Pour Beaufort normal, on fait chiffré = clé-clair, pour la variante allemande clair-clé, l'opposé.
J'ai écrit ce code pour le Beaufort normal d'où la multiplication par -
J'ai simplement ensuite ajouter la multiplication de l'écart calculé par le Variante. C'est tout.
#!/usr/bin/env python
# -*- coding: Latin-1 -*-
def prepare(PhraseDepart):
li1=["âà","éèêë","îï","ô","ûü","ç"]
li2=["A","E","I","O","U","C"]
# Remplacement des caractères accentués éventuels
for i,mot in enumerate(li1):
repl=li2[i]
for lettre in mot:
PhraseDepart=PhraseDepart.replace(lettre,repl)
for lettre in " ',-;:!?. ": # Suppression de la ponctuation et des espaces
PhraseDepart=PhraseDepart.replace(lettre,"")
PhraseDepart=PhraseDepart.upper() # Passage en majuscules
return PhraseDepart
.
Cle="COMPLEXE"
# ***************************************************************
Variante=-1 # 1 : chiffre de Beaufort normal ; -1 : variante allemande
# ***************************************************************
LongCle=len(Cle)
MessageTraite=""
alpha=[chr(65+i) for i in xrange(26)]
PhraseDepart="FELIC ITATI ONSVO USAVE ZREUS SIADE CHIFF RERCE CODEV OUSTR OUVER EZLEL IEUET LACAC HEAUX COORD ONNEE SSUIV ANTES NORDC INQUA NTEDE GRESQ UARAN TECIN QPOIN TSIXC ENTNE UFETE STDEU XDEGR ESVIN GTDEU XPOIN TCINQ CENTQ UARAN TEQUA TREBO NNECH ASSE"
# Les \ ci-dessus permettent d'étaler le texte sur plusieurs lignes
MessageDepart=PhraseDepart # Je garde la trace du message d'origine avant retouches
PhraseDepart=prepare(PhraseDepart)
LongPhraseDepart=len(PhraseDepart)
for i,lt in enumerate(PhraseDepart):
ecart = ((ord(Cle[i%LongCle])-ord(lt))%26)*Variante
MessageTraite+=alpha[ecart]
# Préparation du message de sortie en groupes de 5 lettres séparés par une espace
Coupes=LongPhraseDepart/5-(LongPhraseDepart%5==0)
for i in range(Coupes):
# Ci-dessous : équivalent BASIC : MID$(MessageTraite$,i,5+6*i)+" "+MID$(MessageTraite$,5+6*i,LongPhraseDepart-5-6*i)
MessageTraite=MessageTraite[0:5+6*i]+" "+MessageTraite[5+6*i:LongPhraseDepart]
# Ci-dessous l'équivalent de LongPhraseDepart=LongPhraseDepart+1
LongPhraseDepart+=1
print " Message d'origine :" # non modifié
print MessageDepart
print
print " Message traité :"
print MessageTraite
Résultat du codage
XKBHJ WEEJG YCTJJ KKORL MNTKK WEPIA VXUJH YHNVA AAJLQ QDMJX YVQAG ADDIE DADAJ DMNLC QACUP NXQGB OBZLH MFKUT MCSAF ROXJN DRHKC BTLIA RNYWW VLNXR JKKHY OIQUB TXDHV APVZL RZTLY WTMHK ABYIV LTJPR WVJLR HIQUB TNDRH CYBTZ REGEP VIZRE ENYNY CYAVX CWUL
*
Il est bien différent du précédent...
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#3 02-03-2014 17:01:14
- faivre
- Invité
Re : [Python] Codage/décodage "Chiffre de Beaufort"
pouvez vous m'aider à décrypter ce message qui m'a été envoyé par mon chéri
(ancien casque bleu)
Jm tnjdtjg agp pjdmpe xjnjaatg jgjejlg dtjbon