Yasuhiro Posté(e) le 26 avril 2015 Partager Posté(e) le 26 avril 2015 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 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 VGGVAFXDVGAFXFVDGVAFXDVGAFXFVDVXFAVDVFFXFAXVFAFXDFXDVDVDAGAGXDFFDAFFXVDFFADDGAFFFXFXFADVVGVDVXAFXVDFVGVDVXAFFAXFDFXVAFVFFXDDVDXVFFAAVDVDDFXVAFVFFXVXFADFFXAFVFXAFAVDXVFXDFAFFAVGVDFXXAFADVXDFFXVDFVDFXVXAFVFVGVDVFXDFXVXFFXVFXDFAFXVAAAFVDVFXDGAVGVDFAXVVXVDAGAGXDAFFAFXVDGAVGFFXVDFVDXDAFXVDFDVFAVDXVDFDFAAAFDDDDVDVXFFXVFXVFXVVDAAFADVVGVDVGVDGAVGFFFAFXFAXDXAFFGAAFXDVDVFGXAGVFFAXDFFXAVDXDFXVGGVAFXDFAXGAFXVFFFAXVFXFAGGVFVFXVVDFXDAVGGAGVFAVXVDFFVFAGAFXVVXVXVDVGFFAAAFVFVGFAFXFXVDAAGVFFGGVFVDFAXVFXDFFFXVDFDFVDVXXAAFXDVDVFXVDDAFXDAAVDFFVFVXVFVXVGFAAAVDFFAAGVFFGGVFVDGVAFDDDDVDFFAAAAAFXDVXGAAFVFXDDFAFVFDFVDFXFFFXFFFAFXAFXVDFXDAFFAFXDDFAVGVGVDFXFAGXAAVDXVDFFXAGAFFAFXGAFFXDGVVDVFXDVDVGFFFXVDAAAFXVVXVDAAGVVFAAGVAFDFVDFXAFVFXAFAVDXVFXDFAFFAXDFFGAFAVXVDFFXAVDAAFXFFXAAFFAGXVXFAXVFXVDAADFVDDDFFFAXVDFVDXVFFXVDFVXFADFAXVDFXVFFAFXFFVFDFXDVDAGAFFAFXVDDFAXFFFAGAAFDDGADFFFXAFAVDFFXAVDAADDFFDFXDAFDDGAVDFADDDDAFXVVXVDXDVDDDVDDDDVVDXDFXAFVFXAFAVDXVFXDFAFFAGAXDAFVXFAXFVFVDVDFXDFAFDDVDDDAFXDDDAFXVXFAFFXFAVDXDVXVDDDDFFFVGGAFFXDVGVDDFAFVFDFVDFXVGVDFXVGFFXVXFVFVDFXVGVDFXDDFAXVVFDFVDFXDDAFXDDFVDVGAGAFVGDFXDVDFXAFXVDFVXVDFXXFFFXVXFVFVDFXGGVFFAVGXVVDAGFFVFDFGAFFFXVGAAGVVDXDFXFFXVFXVDXVVDGXDFXDFFFAXDVDVGAFXDFXAFVFXAFAVDXVFXDFAFFAGGVFVDVGVDDFVDDDGAFXVDFXDFVFXVAXAFVFVDVFXDFFXAFAVXVDGGVFFAXFFFXFXVVDFXFFXVFXDFXDFAAAGVVDXDDFAFVFDFAAAFVFGAAAVDFXDFVGFFVGAFFAVGVDAXAFVFXDVXAAXDAFDFVGFFXVVFFADFFFVFXFDDVDXVDFVDFXAFVFXAFAVDXVFXDFAFFAVGVDXFAFVFAGAGXDVDFFDFAFVFAXAFVFXDFXFXAFFAAGVGFFAAVGVDGAFXDAVXXDVDFXVDXAFAVXVDDFFFXVDFDFFXAFXVXVVDXDFFVGGVVDVFXDVDAFVGVDVXFAXAFAXVGVFFFXFFXDVXAFVGFFVFXFVFFXDFVDXAVDXDDFVFDFAFXVGAAFVFFXVDVDXVAAAFXDXAFAVDXDXFVDAFVGVDXDVDGAVDXVDFFAXDDDDDVDAFGVVGFFVXVDXDXVFAXDVDFFVFDVVDXDXFVDAFDFAFVFDFDFVDVXFAXDFFDDVDVFXDFXXAFAVDVFGXVGAAGVVDFAVGVDFXDFDFXDAFGADFFFXDVXAAGVFFXDVGVDFXDVFFVFVXVDVGFFFAXDVDXXXXDD É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 More sharing options...
Stalroc Posté(e) le 26 avril 2015 Partager Posté(e) le 26 avril 2015 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 More sharing options...
Warff Posté(e) le 26 avril 2015 Partager Posté(e) le 26 avril 2015 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 More sharing options...
pcote Posté(e) le 26 avril 2015 Partager Posté(e) le 26 avril 2015 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 More sharing options...
RyeMash Posté(e) le 27 avril 2015 Partager Posté(e) le 27 avril 2015 Je vais tenter aussi Lien vers le commentaire Partager sur d’autres sites More sharing options...
Yasuhiro Posté(e) le 27 avril 2015 Auteur Partager Posté(e) le 27 avril 2015 Je tiens à m'excuser auprès des participants car en effet il y avait des erreurs dans les deux premiers messages suite à un cryptage avec des accents... Elles viennent d'être corrigées. Lien vers le commentaire Partager sur d’autres sites More sharing options...
theor67 Posté(e) le 27 avril 2015 Partager Posté(e) le 27 avril 2015 Concours du Chiffre http://comicsanscriminal.com/ Je participe, enfin je vais essaie Lien vers le commentaire Partager sur d’autres sites More sharing options...
theor67 Posté(e) le 27 avril 2015 Partager Posté(e) le 27 avril 2015 Je ne suis pas matheux, mais j'ai lu quelques articles là-dessus, j'en tenterai un ou deux comme ça. C'est pas des maths, mais de la logique. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Yasuhiro Posté(e) le 27 avril 2015 Auteur Partager Posté(e) le 27 avril 2015 C'est pas des maths, mais de la logique. Ah parce-que RSA c'est de la logique ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
theor67 Posté(e) le 27 avril 2015 Partager Posté(e) le 27 avril 2015 Ah parce-que RSA c'est de la logique ? Celui-ci oui, mais si t'es nul en math -> 3 premier son simple, surtout celui Vignère tu trouve des tables de décryptage assez vite. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Yasuhiro Posté(e) le 27 avril 2015 Auteur Partager Posté(e) le 27 avril 2015 C'est fait exprès, pour pimenter un peu le jeu Mais si personne ne trouve je donnerais des indications. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Creator769 Posté(e) le 27 avril 2015 Partager Posté(e) le 27 avril 2015 Nan mais plz, pas du latin xD Je veux bien essayer mais s'il y a du latin ça va pas le faire, j'y connais rien moi. Lien vers le commentaire Partager sur d’autres sites More sharing options...
glandudu68 Posté(e) le 27 avril 2015 Partager Posté(e) le 27 avril 2015 Hello , je vais tenter ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Carnegie_fr Posté(e) le 27 avril 2015 Partager Posté(e) le 27 avril 2015 je vais essayer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Yasuhiro Posté(e) le 27 avril 2015 Auteur Partager Posté(e) le 27 avril 2015 Bon pour le moment vous vous en sortez bien ! La grande majorité d'entre vous a déjà décrypté les deux premiers messages et quelques uns ont déchiffré le troisième. Lien vers le commentaire Partager sur d’autres sites More sharing options...
pcote Posté(e) le 21 mai 2015 Partager Posté(e) le 21 mai 2015 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 More sharing options...
RyeMash Posté(e) le 21 mai 2015 Partager Posté(e) le 21 mai 2015 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 More sharing options...
DomFulmen Posté(e) le 21 mai 2015 Partager Posté(e) le 21 mai 2015 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. Lien vers le commentaire Partager sur d’autres sites More sharing options...
RyeMash Posté(e) le 22 mai 2015 Partager Posté(e) le 22 mai 2015 C'est un bon film? Je sais comment la machine fonctionne, mais si tu me dis que c'est un bon film je le regarderai avec plaisir Lien vers le commentaire Partager sur d’autres sites More sharing options...
DomFulmen Posté(e) le 22 mai 2015 Partager Posté(e) le 22 mai 2015 Vraiment très sympa oui, et en prime il t'expliquera le fonctionnement de la machine et quelques autres trucs qui peuvent t'intéresser. (Et accessoirement, te fera pleurer sur le nombre de configurations possibles de la machine. ) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Yasuhiro Posté(e) le 22 mai 2015 Auteur Partager Posté(e) le 22 mai 2015 Alors oui le concours est toujours est toujours d'actualité et non il n'y a pas eu de triche. Rye je te file le programme ce soir. Lien vers le commentaire Partager sur d’autres sites More sharing options...
pcote Posté(e) le 22 mai 2015 Partager Posté(e) le 22 mai 2015 Rye je te file le programme ce soir. Si ça c'est pas assez explicite sur le genre """"d'aide"""" qu'ils s'offrent entre Névains, et bien je ne suis plus atteint de Kariboutite ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Yasuhiro Posté(e) le 22 mai 2015 Auteur Partager Posté(e) le 22 mai 2015 Voici le programme que j'ai utilisé pour Enigma (nb : je l'ai fait moi-même).# Source: http://en.wikipedia....a_rotor_details 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 More sharing options...
Yasuhiro Posté(e) le 22 mai 2015 Auteur Partager Posté(e) le 22 mai 2015 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 More sharing options...
Yasuhiro Posté(e) le 22 mai 2015 Auteur Partager Posté(e) le 22 mai 2015 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 More sharing options...
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant