Aller au contenu

[Concours] Concours du Chiffre


Yasuhiro
 Partager

Messages recommandés

Concours du Chiffre

 

Bien le bonsoir chers minefildiennes et minefieldiens !

 

Je vous annonce en cette belle nuit le début du Concours du Chiffre. Préparez vos cerveaux car ils vont chauffer !

 

Qu'est-ce donc que le Concours du Chiffre ?

 

Le Concours du Chiffre est une épreuve faisant appel à toutes vos capacités intellectuelles et qui consiste en le déchiffrage de neuf cryptogrammes qui vous seront exposés ci-dessous. Pour ceux qui ne savent pas, un cryptogramme est un message codé.

 

Comment participer ?

 

C'est très simple, il vous suffit de m'envoyer un message privé sur le forum ou alors de poster à la suite de ce sujet. A noter que vous pouvez participer en groupe.

 

Quelles sont les règles ?

 

L'épreuve est composée de neuf cryptogrammes. Pour pouvoir remporter le concours, vous devez déchiffrer TOUS les cryptogrammes. Vous pouvez m'envoyer un à un les cryptogrammes déchiffrés mais vous devez tout de même m'expliquer brièvement la façon dont vous avez procédé. Vous avez devant vous une durée de deux mois (voir trois) pour tout déchiffrer.

 

Qu'est-ce qu'on remportera ?

 

Surprise :P

 

Voici donc les cryptogrammes :

 

Étape 1 : Chiffre de substitution monoalphabétique


GSOIPYC VMDI GC BSYOI VCI CTCDCFCDUI LYFMKDI, KG VCTKCDU DCBCIIMKOC ASYO YD ACYAGC VC VKIISYVOC GCI GKCDI ASGKUKPYCI PYK G'SDU MUUMBLC M YD MYUOC CU VC AOCDVOC, AMOFK GCI AYKIIMDBCI VC GM UCOOC, GM AGMBC ICAMOCC CU CZMGC M GMPYCGGC GCI GSKI VC GM DMUYOC CU VY VKCY VC GM DMUYOC GYK VSDDCDU VOSKU, GC OCIACBU VY M G'SAKDKSD VC G'LYFMDKUC SNGKZC M VCBGMOCO GCI BMYICI PYK GC VCUCOFKDCDU M GM ICAMOMUKSD. DSYI UCDSDI ASYO CTKVCDUCI ASYO CGGCI-FCFCI GCI TCOKUCI IYKTMDUCI: USYI GCI LSFFCI ISDU BOCCI CZMYE; KGI ISDU VSYCI AMO GC BOCMUCYO VC BCOUMKDI VOSKUI KDMGKCDMNGCI; AMOFK BCI VOSKUI IC UOSYTCDU GM TKC, GM GKNCOUC CU GM OCBLCOBLC VY NSDLCYO.

 

Étape 2 : Chiffre de César

 

VKWKBMRONOCFOBDEOEHOCDCOWOONYLCDKMVOCAESCYXDVOCOXDBOZBSCOCOQYSCDOCAEOPKSDCKXCPSXCEBQSBVYOEFBONEWKVSXLOXSCYSDSVVRYWWONOLYXXOFYVYXDOAESKEXYWNOVKMRKBSDOCOPKSDVOLOBQOBNOCPKSLVOCAESVQESNONKXCVKFKVVOONYWLBONOVKWYBDODNOCVKBWOCMKBSVOCDVOQKBNSOXNOCYXPBOBOODVKZBYFSNOXMONOCOXPKXDCQKBOCTKLKDDBKSKVYBCVOLBKCNEXODOBBSLVOMYVOBONEXOFOXQOKXMOPEBSOECOODOPPBKIKXDOCEBVOCRYBNOCSWZSOCAESZYEBMRKCCOXDODBONESCOXDXOKXDVOCLBOLSCNONSOEODDEMYXXKSDBKCZYEBAEYSWYXXYWOCDVDOBXOVAEKXNCEBDYSCKLKDDBKVKFOXQOKXMONEDYEDZESCCKXD

 

Étape 3 : Chiffre de Vigenère

 

GYICBASLUVDYZHPAGDNKRMISANROEBGUPATCVDMBZWZITCIIDLAXDBBFGJNA HQZLPVWZRPCIMEAFGMOIRQXOYNQAILEMDMWRVVUPGHDMLAWPSHQGJRW BVDSZHMHOKHPPMJBQKOUVUPEZVQPLZVUPAPAYZNPEIITBEJMUZGVVMHEQJRP FIOAXHEHSPZYGAJYMBNHPSIFLEVDCBEEIDVZSSCHQEPEYVJGEUFEYSPAKPLH NXLULVHZNAVHZMKVGOIANRNQBNPDSHEXDFLKTZRLB

 

Étape 4 : Chiffre ADFGVX

 

VGGVAFXDVGAFXFVDGVAFXDVGAFXFVDVXFAVDVFFXFAXVFAFXDFXDVD
VDAGAGXDFFDAFFXVDFFADDGAFFFXFXFADVVGVDVXAFXVDFVGVDVXAF
FAXFDFXVAFVFFXDDVDXVFFAAVDVDDFXVAFVFFXVXFADFFXAFVFXAFA
VDXVFXDFAFFAVGVDFXXAFADVXDFFXVDFVDFXVXAFVFVGVDVFXDFXVX
FFXVFXDFAFXVAAAFVDVFXDGAVGVDFAXVVXVDAGAGXDAFFAFXVDGAVG
FFXVDFVDXDAFXVDFDVFAVDXVDFDFAAAFDDDDVDVXFFXVFXVFXVVDAA
FADVVGVDVGVDGAVGFFFAFXFAXDXAFFGAAFXDVDVFGXAGVFFAXDFFXA
VDXDFXVGGVAFXDFAXGAFXVFFFAXVFXFAGGVFVFXVVDFXDAVGGAGVFA
VXVDFFVFAGAFXVVXVXVDVGFFAAAFVFVGFAFXFXVDAAGVFFGGVFVDFA
XVFXDFFFXVDFDFVDVXXAAFXDVDVFXVDDAFXDAAVDFFVFVXVFVXVGFA
AAVDFFAAGVFFGGVFVDGVAFDDDDVDFFAAAAAFXDVXGAAFVFXDDFAFVF
DFVDFXFFFXFFFAFXAFXVDFXDAFFAFXDDFAVGVGVDFXFAGXAAVDXVDF
FXAGAFFAFXGAFFXDGVVDVFXDVDVGFFFXVDAAAFXVVXVDAAGVVFAAGV
AFDFVDFXAFVFXAFAVDXVFXDFAFFAXDFFGAFAVXVDFFXAVDAAFXFFXA
AFFAGXVXFAXVFXVDAADFVDDDFFFAXVDFVDXVFFXVDFVXFADFAXVDFX
VFFAFXFFVFDFXDVDAGAFFAFXVDDFAXFFFAGAAFDDGADFFFXAFAVDFF
XAVDAADDFFDFXDAFDDGAVDFADDDDAFXVVXVDXDVDDDVDDDDVVDXDFX
AFVFXAFAVDXVFXDFAFFAGAXDAFVXFAXFVFVDVDFXDFAFDDVDDDAFXD
DDAFXVXFAFFXFAVDXDVXVDDDDFFFVGGAFFXDVGVDDFAFVFDFVDFXVG
VDFXVGFFXVXFVFVDFXVGVDFXDDFAXVVFDFVDFXDDAFXDDFVDVGAGAF
VGDFXDVDFXAFXVDFVXVDFXXFFFXVXFVFVDFXGGVFFAVGXVVDAGFFVF
DFGAFFFXVGAAGVVDXDFXFFXVFXVDXVVDGXDFXDFFFAXDVDVGAFXDFX
AFVFXAFAVDXVFXDFAFFAGGVFVDVGVDDFVDDDGAFXVDFXDFVFXVAXAF
VFVDVFXDFFXAFAVXVDGGVFFAXFFFXFXVVDFXFFXVFXDFXDFAAAGVVD
XDDFAFVFDFAAAFVFGAAAVDFXDFVGFFVGAFFAVGVDAXAFVFXDVXAAXD
AFDFVGFFXVVFFADFFFVFXFDDVDXVDFVDFXAFVFXAFAVDXVFXDFAFFA
VGVDXFAFVFAGAGXDVDFFDFAFVFAXAFVFXDFXFXAFFAAGVGFFAAVGVD
GAFXDAVXXDVDFXVDXAFAVXVDDFFFXVDFDFFXAFXVXVVDXDFFVGGVVD
VFXDVDAFVGVDVXFAXAFAXVGVFFFXFFXDVXAFVGFFVFXFVFFXDFVDXA
VDXDDFVFDFAFXVGAAFVFFXVDVDXVAAAFXDXAFAVDXDXFVDAFVGVDXD
VDGAVDXVDFFAXDDDDDVDAFGVVGFFVXVDXDXVFAXDVDFFVFDVVDXDXF
VDAFDFAFVFDFDFVDVXFAXDFFDDVDVFXDFXXAFAVDVFGXVGAAGVVDFA
VGVDFXDFDFXDAFGADFFFXDVXAAGVFFXDVGVDFXDVFFVFVXVDVGFFFA
XDVDXXXXDD

 

Étape 5 : Chiffre Playfair

 

PDQPU NHKUE KSDFI FKDAP RDPQQ UKHKU DYYOO MUEKS UNEPB VUNXB CYUSU PBKJM BOBKK BQFKU FECYM APEEF PDHTU SAKUS MEKUB YKBYO FANBM ARCUP BKGRK STOKB UYEPI TIOUP CRGBO XEFDM HXEPO ARCEF DFYKV SASPB FAZGD UEMMF NMSXO BHZFK KSEFY PYOUG BKRAP DUMIF DKGIF KZOSX PDNOS QFOVY YOBKB KYBRJ BKBYK BHOUN SHEFY CAFKD SZDFX IPDIB AIYEU BSLKD DIJMF BBUME KCOSE PLUUK PBFAV YSBOX BKPDI TKTRJ SMSKB KFKBF RUMQD REYMR AOFOV YYODP BKLOF KUXPD KBXGB KARKS BKFMO EASKH BKEFJ IKHSB KUBK

 

Étape 6 : Enigma

 

XLATEGFZCYPOERPVCBEFAHRJACYRSOBTYTPGICCOLNAMPITFWXZCRCQLHYUHLUZYXWRMYZFXWEKCOUFHEPLSDKULIXFLBRKVOUMHVTQKBAKSTHOQOQBEICSKRNEZABOURWCPQHWMIHXSVELITGBZRQRNDPOHXLEBXARWLPQXZUXNQCILSPPWWPXYFDUZDODESFJQLUWYYYGKJQGUGFISMBAQNRXJCDALWDFKSXGBYKNPKSGCGIINGAGGBZUOOFJHIFGLOXCRFBULWGVKVIELLOWVHDKDRZWYPTUWKFEWWIWTUKDYCLXWRJHGGMPAYQIFWQDMVGELRMZKPOUGCZJHSHPOGGARMGAQGBZHJIKNKONNLUFMZNVKMTTZILWORYOHBHEQHXLUUTHWTCDOJKVNNMYMFRVCPTPMPGTREYEXNMIYLSDIZTPZWMMQPAXAAKLWWVHXGUEQQNTCMHBQLYVPKERNDXEKSBGGTPZBBANSCTPVQFJPVMKOQK

 

La machine comporte trois rotors, le tableau de connexions n'est pas utilisé.

 Étape 7 :

 

LTKUTBENAJWRCFGBAJSVGKURAFAJKPRFZUANEMEB XPNYGOXAQHGWHJNIAJKPIIGBSMLTKOTAITWQTOKL WHNNLEOGITGORZDHIECQLEEOQESMWHENZLQFYWVK YTWIGTSDWROHITWHDRRSVZVXSMVZPDLECFLTITYE KCSVWQENAJXPAIEOFHSYYKFKCIOGKPJPUAFKEORP LXWBMYJEEOWHJTENWRAZWQDQYRYWXTURENWHJTEL GOFXVXMBWRSMRLNINJRBORVZTJSORPBNHZIVCBVR WHQHVRENGGOERPENBHOQYZUYANSLGHQHVRVZEMAJ NJIIENVZFBIPVZBNZBVGSMEOHGEOKRGBYECFSIRF XPVXSMEOHGUZMBII

 

Étape 8 :

 

174 280 333

 

Étape 9 :

 

 

Message court :

 

10052 30973 22295 13534 12990 66921 15454 81904 58209 26472 18119 11542 99190 01294 87266 20201 55809 80932 92390 96710 64341 91354 27685 27572 48495 78859 80627 33369 29356 36094 85523

 

Message long :

 

begin 600 text.d

 

M.4#)>SI:R!!4)NA+\%T%V /(AW!7HHDPS$;T[\E!RWA?,J8:X#D[!:XF,A>KMXT9$Q)37\IOMG

6KL-$6?A!#FZ2Y)N+K %*.^2K!SP?Z2'8O7LZ]QP \T=QG-*MAMJA;Q@3H[8^U/L<ILL%TA0J9M*@8F?H:76%<33JOESAP=@3:(\:8NBGFM0M,MP3B^CP %/D8DICZ$VO(7IS(DTJRZY- 7I\-#VI0''>J@+O!CT.+6B9K$J%4:EAB9%#;(P+I>1!#<+2+;(7.W<

 

Je reste bien entendu disponible sur le forum ainsi que sur Mumble et en jeu si vous souhaitez obtenir plus d'informations !

 

Je vous souhaite à tous bonne chance et que le meilleur cryptanalyste gagne !

Lien vers le commentaire
Partager sur d’autres sites

Les gars j'ai trouvé plus sadique que le donjon de Galianör, que les quêtes de Viaduc, que les râles d'AntoineKia !!

Où va le monde ?!?

 

Sinon en dehors de cette plaisanterie, je trouve que l'idée est fortement intéressante :)

Cependant j'aimerai te suggérer une petite amélioration : il serait fort intéressant de placer ses épreuves in game (à l'aide de livres, de panneaux, ...)

 

Bref je ne sais pas trop quelles connaissances il faut pour comprendre ce langage mais je vais me pencher dessus histoire de voir :)

Sur ce je vais dormir.

 

Bon courage pour ses déchiffrages.

 

 

Amicalement,

Stalroc.

Lien vers le commentaire
Partager sur d’autres sites

Ah, intéressant :) !

 

J'étais trop fan de cryptologie quand j'étais jeune (il y a genre 7 ans). J'écrivais des messages codés et je narguais ma soeur avec xD

 

En tout cas, heureusement que tu précises les méthodes de codage, ça facilitera la découverte des clés ^^ ! J'ai mes exams là, je tenterais dans quelques semaines !

Lien vers le commentaire
Partager sur d’autres sites

Aaaahhhh, y'a plein de fautes des les messages cryptés ! Ça complique la tâche quand on se base sur la fréquence des lettres et leur emplacement :?

Sinon c'est sympa, je vais essayer de tous les faire, bien qu'il y en ait qui soient probablement pas mal au-dessus de mes compétences.

 

P.S. T'abuses vraiment, que ça soit au niveau de la clé ou du message de l'étape 3 x)

Lien vers le commentaire
Partager sur d’autres sites

Le concours est toujours d'actualité, du moins je ne vois pas de raisons pour lesquelles il ne le serait plus, sauf que y'a RyeMash qui est à seulement 2-3 codes d'avoir fini mais il y a sûrement triche entre Névains !

Lien vers le commentaire
Partager sur d’autres sites

nop, j'ai pas triché xD, mais il me faudrait juste la tronche des roues pour enigma ou tout simplement le code qui a permis de l'encoder car en l'état c'est pas faisable.

 

Pour info j'ai fait les codes 1,2,3,4,5,9 et peut-être le 8 (mais c'est à confirmer).

 

Donc normalement il me reste le 6 (enigma) et le 7.

Lien vers le commentaire
Partager sur d’autres sites

nop, j'ai pas triché xD, mais il me faudrait juste la tronche des roues pour enigma ou tout simplement le code qui a permis de l'encoder car en l'état c'est pas faisable.

 

Pour info j'ai fait les codes 1,2,3,4,5,9 et peut-être le 8 (mais c'est à confirmer).

 

Donc normalement il me reste le 6 (enigma) et le 7.

Si on parle bien de la même Enigma, vois The Imitation Game, le film ne parle que de ça. :P

Lien vers le commentaire
Partager sur d’autres sites

Voici le programme que j'ai utilisé pour Enigma (nb : je l'ai fait moi-même).
 
modele_rotor_alphabet = {
    'I' : 'EKMFLGDQVZNTOWYHXUSPAIBRCJ',   # 1930 Enigma I
    'II' : 'AJDKSIRUXBLHWTMCQGZNPYFVOE',   # 1930 Enigma I
    'III' : 'BDFHJLCPRTXVZNYEIWGAKMUSQO',   # 1930 Enigma I
    'IV' : 'ESOVPZJAYQUIRHXLNFTGKDCMWB',   # DEC 1938 M3 Army
    'V' : 'VZBRGITYUPSDNHLXAWMJQOFECK',   # DEC 1938 M3 Army
    'VI' : 'JPGVOUMFYQBENHZRDKASXLICTW',   # 1939 M3 & M4 Naval (FEB 1942)
    'VII' : 'NZJHGRCXMYSWBOUFAIVLPEKQDT',   # 1939 M3 & M4 Naval (FEB 1942)
    'VIII' : 'FKQHTLXOCBJSPDZRAMEWNIUYGV',   # 1939 M3 & M4 Naval (FEB 1942)
}
 
modele_rotor_encoche = {
    'I' : 'Q',    # If rotor steps from Q to R, the next rotor is advanced
    'II' : 'E',    # If rotor steps from E to F, the next rotor is advanced
    'III' : 'V',    # If rotor steps from V to W, the next rotor is advanced
    'IV' : 'J',    # If rotor steps from J to K, the next rotor is advanced
    'V' : 'Z',    # If rotor steps from Z to A, the next rotor is advanced
    'VI' : 'Z',    # if rotor steps from Z to A, or from M to N the next rotor is advanced
    'VII' : 'Z',    # if rotor steps from Z to A, or from M to N the next rotor is advanced
    'VIII' : 'Z',    # if rotor steps from Z to A, or from M to N the next rotor is advanced
}
 
modele_reflecteur_alphabet = {
    'A' : 'EJMZALYXVBWFCRQUONTSPIKHGD',    # Reflector A
    'B' : 'YRUHQSLDPXNGOKMIEBFZCWVJAT',    # Reflector B
    'C' : 'FVPJIAOYEDRZXWGCTKUQSBNMHL',    # Reflector C
}
 
 
 
def connexion(alphabet):
    cn = []
    for c in alphabet:
        cn = cn + [ord© - ord("A")]
    return cn
 
def connexion_inverse(connexion):
    i = 0
    cni = []
    while i < len(connexion):
        cni = cni + [connexion.index(i)]
        i = i + 1
    return cni
 
class Rotor:
 
 # *constructeur* de la *classe*: initialise les *champs* de l'objet
    def __init__(self, modele, alphabet = None, encoche = None, position = 0):
        self.modele = modele
        if alphabet is None:
            alphabet = modele_rotor_alphabet[modele]
        self.connexions = connexion(alphabet)
        self.longueur = len(self.connexions)
        self.connexions_inverses = connexion_inverse(self.connexions)
        if encoche is None:
            encoche = modele_rotor_encoche[modele]
        self.encoche = ord(encoche) - ord('A')
        self.position = position
 
    # méthode d'affichage: retourne une chaine de caractères fabriquée à partir des champs de l'objet
    def __str__(self):
        s = 'Rotor:'
        s += ' modele ' + self.modele
        s += ' connexions ' + str(self.connexions)
        s += ' connexions_inverses ' + str(self.connexions_inverses)
        s += ' position ' + str(self.position) + '\n'
        return s
 
    def rotation(self):
        r = False
        if self.position == self.encoche:
            r = True
        self.position = (self.position + 1) % self.longueur
        return r
 
    def connecte(self, contact):
        sortie = self.connexions[(contact + self.position) % self.longueur]
        sortie = (sortie - self.position) % self.longueur
        return sortie
 
    def connecte_inverse(self, contact):
        sortie = self.connexions_inverses[(contact + self.position) % self.longueur]
        sortie = (sortie - self.position) % self.longueur
        return sortie
 
 
class Reflecteur:
    def __init__(self, modele, alphabet = None):
        self.modele = modele
        if alphabet is None:
            alphabet = modele_reflecteur_alphabet[modele]
        self.connexions = connexion(alphabet)
 
    def __str__(self):
        s = 'Reflecteur:'
        s += ' modele ' + self.modele
        s += ' connexions ' + str(self.connexions) + '\n'
        return s
 
    def connecte(self, contact):
        return self.connexions[contact]
 
 
class Enigma:
    def __init__(self, n_rotors):
        self.n_rotors = n_rotors
        self.rotors = [None] * n_rotors
        self.reflecteur = None
 
    def __str__(self):
        s = ''
        for r in self.rotors:
            s += str®
        s += str(self.reflecteur)
        return s
 
    def rotation(self):
        r = 0
        while r < self.n_rotors:
            if self.rotors[r].rotation() is False:
                return
            r = r + 1
 
    def connecte(self, contact):
        self.rotation()
        r = 0
        while r < self.n_rotors:
            contact = self.rotors[r].connecte(contact)
            r = r + 1
        contact = self.reflecteur.connecte(contact)
        r = self.n_rotors - 1
        while r >= 0:
            contact = self.rotors[r].connecte_inverse(contact)
            r = r - 1
        return contact
 
    def chiffre(self, message):
        message_c = ''
        for c in message:
            contact_entree = ord© - ord('A')
            contact_sortie = self.connecte(contact_entree)
            char_c = chr(contact_sortie + ord('A'))
            message_c = message_c + char_c
        return message_c
 
 
class Solution:
 
    def __init__(self, rotors, reflecteur, positions):
        self.rotors = [None] * 3
        for i in range(3):
            self.rotors = rotors
        self.reflecteur = reflecteur
        self.positions = [None] * 3
        for i in range(3):
            self.positions = positions
    
    def __str__(self):
        s = '('
        for rotor in self.rotors:
            s += rotor.modele + ' '
        s += self.reflecteur.modele + ' '
        for position in self.positions:
            s += str(position) + ' '
        s += ')'
        return s

 

Lien vers le commentaire
Partager sur d’autres sites

Suite du programme :

 

class Bombe3:
    """
    Initialise une bombe.
    Création des différents rotors et réflecteurs possibles.
    """
    def __init__(self):
        self.enigma = Enigma(3)
        self.solutions = []
        self.rotors = [None] * 8
        modeles = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII']
        for i in range(8):
            self.rotors = Rotor(modeles)
        self.reflecteurs = [None] * 3
        modeles = ['A', 'B', 'C']
        for i in range(3):
            self.reflecteurs = Reflecteur(modeles)
 
    """
    recherche les modèles possibles des rotors et du réflecteur
    pour chaque possibilité de modèle des rotors et du réflecteur, on recherche les
    positions initiales possibles en appelant la méthode cherche_positions pour
    rechercher le mot certain (crib) dans les messages déchiffrés
    on retourne la liste des solutions possibles
    """
    def cherche_modeles(self, message_chiffre, crib):
        for rotor_0 in self.rotors:
            for rotor_1 in self.rotors:
                if rotor_1 is rotor_0:
                    continue
                for rotor_2 in self.rotors:
                    if rotor_2 is rotor_1 or rotor_2 is rotor_0:
                        continue
                    for reflecteur in self.reflecteurs:
                        self.enigma.rotors[0] = rotor_0
                        self.enigma.rotors[1] = rotor_1
                        self.enigma.rotors[2] = rotor_2
                        self.enigma.reflecteur = reflecteur
                        if self.cherche_positions(message_chiffre, crib) is not None:
                            return self.solutions
        return None
 
    """
    essaye toutes les postions initiales possibles (p0, p1, p2) des 3 rotors.
    pour chaque position p0,p1,p2 déchiffre le message.
    dans le message, on cherche le mot certain (crib)
    s'il est trouvé on ajoute la solution dans la liste des solutions possibles
    on retourne la liste des solutions possibles
    """
    def cherche_positions(self, message_chiffre, crib):
        print('Recherche des positions pour rotor1=%s rotor2=%s rotor3=%s reflecteur=%s' 
              % (self.enigma.rotors[0].modele, 
                 self.enigma.rotors[1].modele, 
                 self.enigma.rotors[2].modele, self.enigma.reflecteur.modele), 
              end = '', 
              flush = True)
        l_connexions = self.enigma.rotors[0].longueur
        for p0 in range(l_connexions):
            for p1 in range(l_connexions):
                for p2 in range(l_connexions):
                    self.enigma.rotors[0].position = p0
                    self.enigma.rotors[1].position = p1
                    self.enigma.rotors[2].position = p2
                    message_clair = self.enigma.chiffre(message_chiffre)
                    if crib in message_clair:
                        self.solutions.append(Solution(self.enigma.rotors, self.enigma.reflecteur, [p0, p1, p2]))
                        print(' %d %d %d :)' % (p0, p1, p2))
                        return self.solutions
        print(' :(')
        return None
 
    """
    Pour chaque solution trouvée, déchiffre le message et
    imprime le message clair.
    """
    def message_d(self, message_chiffre):
        for s in self.solutions:
            for i in range(3):
                self.enigma.rotors = s.rotors
                self.enigma.rotors.position = s.positions
            self.enigma.reflecteur = s.reflecteur
            message_clair = self.enigma.chiffre(message_chiffre)
            print ('%s -> %s' % (str(s), message_clair))
Lien vers le commentaire
Partager sur d’autres sites

Exemple d'un programme de test :

 

 
"""
Programme de test du chiffrement et de la cryptanalyse
"""
 
import enigma
import time
 
print()
 
en = enigma.Enigma(3)
en.rotors[0] = enigma.Rotor(modele = 'III')
en.rotors[1] = enigma.Rotor(modele = 'II')
en.rotors[2] = enigma.Rotor(modele = 'I')
en.reflecteur = enigma.Reflecteur(modele = 'B')
 
message = 'KLARWETTERAUFNORMANDIE'
en.rotors[0].position = 7
en.rotors[1].position = 2
en.rotors[2].position = 8
message_chiffre = en.chiffre(message)
print('Le message %s est chiffré en %s' % (message, message_chiffre))
 
bombe = enigma.Bombe3()
bombe.enigma.rotors[0] = enigma.Rotor(modele = 'III')
bombe.enigma.rotors[1] = enigma.Rotor(modele = 'II')
bombe.enigma.rotors[2] = enigma.Rotor(modele = 'I')
bombe.enigma.reflecteur = enigma.Reflecteur(modele = 'B')
 
temps_debut = time.time()
s = bombe.casse(message_chiffre, 'WETTER')
temps_fin = time.time()
duree = temps_fin - temps_debut
 
print('La bombe a trouvé les solutions: %s en %f secondes' % (str(s), duree))
print('Les messages déchiffrés sont:')
bombe.message_d(message_chiffre, solutions = s)
Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
 Partager

×
×
  • Créer...