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

           Message 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]

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

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)?
soixante et onze moins 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