fonto: http://inventwithpython.com/chapter14.html
Temoj Kovritaj dum tiu ĉapitro:
- Ĉifriko kaj ciferoj
- Encrypting kaj decrypting
- Ĉifrita teksto, teksto, ŝlosilojn, kaj simboloj
- Cezaro Cipher
- ASCII orda valoroj
- La chr() kaj ord() funkcioj
- La isalpha() kordoj metodo
- La isupper() kaj islower() kordoj metodoj
- Ĉifranalitiko
- La tekniko konata kiel bruta forto
Ĉar tiu programo manipulas teksto por konverti ĝin en sekreto mesaĝojn, ni lernos kelkajn novajn funkciojn kaj metodoj kiuj venis kun Python por manipulanta kordoj. Ni ankaŭ lerni programoj povas fari math kun teksto kordoj, tiel ĝi povas kun nombroj.
Pri Ĉifriko
La scienco de skribi sekretajn kodojn nomas ĉifriko. Ĉifriko estis uzita dum miloj da jaroj por sendi sekreta mesaĝojn kiuj nur la ricevanto povas kompreni, eĉ se iu kaptis la sendito kaj legis la kodita mesaĝo. Sekreta kodo sistemo nomiĝas ĉifro. Ekzistas miloj da malsamaj ĉifroj kiuj estis uzita, ĉiu uzante malsamaj teknikoj, por gardi la mesaĝojn sekreta.En ĉifriko, ni nomas la mesaĝo, ke ni volas esti sekreta la kompletan tekston. La kompleta teksto povis rigardi ion kiel jene:
Saluton tie! La ŝlosiloj al la domo estas kaŝitaj sub la ruĝeta floro poto.
Kiam ni konverti la tekston en la kodita mesaĝo, ni nomas tion encrypting la kompletan tekston. La kompleta teksto estas ĉifrita en la ĉifrita teksto. La ĉifrita teksto aspektas kiel hazarda literoj (ankaŭ nomita rubo datumoj), kaj ni ne povas kompreni kio estas la originala teksto estis por nur rigardante la ĉifrita teksto. Jen ekzemplo de iu ĉifrita teksto:
Ckkz fkx kj becqnejc kqp pdeo oaynap iaoowca!
Sed se ni scias pri la ĉifra uzata por kodi la mesaĝon, ni povas deĉifri la ĉifrita teksto al la kompleta teksto. (Malĉifro estas la malo de ĉifrado.)
Multaj ĉifroj ankaŭ uzi klavoj. Klavoj estas sekretaj valoroj kiuj permesas vin deĉifri ĉifrita teksto kiu estis ĉifrita uzante specifan ĉifro. Pensu pri la kodita kiel estante kiel pordo seruro. Kvankam ĉiuj la pordo buklojn de la sama tipo estas konstruitaj la sama, sed aparta seruro nur malŝlosi se vi havas la ŝlosilon faris por tiu seruro.
Cezaro Cipher
Figuro 14-1: Moviĝi super literojn de tri spacoj. Ĉi tie, B iĝas E.
Cezaro Cipher estis unu el la plej fruaj ĉifroj iam elpensis. En ĉi tiu kodita, vi kodi mesaĝon per prenante ĉiu litero en la mesaĝon (en ĉifriko, tiuj literoj estas nomitaj simboloj ĉar ili povas esti literoj, ciferoj, aŭ iu ajn alia signo) kaj anstataŭi ĝin per "moviĝis" litero. Se vi ŝanĝi la literon A per unu spaco, vi ricevas la literon B. Se vi ŝanĝi la literon A per du spacoj, vi ricevas la literon C. Figuro 14-1 estas portreto de iuj literoj ŝanĝiĝis super de 3 spacoj.
Por ricevi ĉiu ŝanĝis literon, nudigos vico de skatoloj kun ĉiu litero de la alfabeto. Tiam desegni duan vicon de skatoloj sub ĝi, sed komenci iun numeron de spacoj super. Kiam vi atingos la sobrante literoj je la fino, envolver ĉirkaŭ reen al la komenco de la skatoloj. Jen ekzemplo kun la literoj ŝanĝiĝis de tri spacoj:
Figuro 14-2: La tuta alfabeto ŝanĝiĝis de tri spacoj.
Uzanta ŝlosilon de 3, se ni ĉifri la kompleta teksto "Howdy", tiam la "H" igas "K". La litero "o" fariĝas "r". La litero "w" igas "z". La litero "d" igas "g". Kaj la litero "y" igas "b". La ĉifrita teksto de "Saluton" kun ŝlosilo 3 iĝas "Krzgb".
Ni gardos ajna ne-letero gravuloj la sama. Por malĉifri "Krzgb" kun la klavo 3, ni nur iri al la fundo skatoloj reen al la supro. La litero "K" igas "H", la litero "r" fariĝas "o", la litero "z" igas "w", la litero "g" igas "d", kaj la litero "b" igas "y" por formi "Howdy".
Vi povas eltrovi pli pri la cezaro Cipher el Vikipedio en http://en.wikipedia.org/wiki/Caesar_cipher
ASCII, kaj Uzanta Nombroj por Literoj
Kiel ni apliki ĉi movo de la literoj en nia programo? Ni povas fari ĉi tion reprezentas ĉiu litero kiel nombro (nomita orda), kaj tiam adicianta aŭ subtrahanta el tiu nombro por formi novan numeron (kaj nova letero). ASCII (prononcita "demandi-ee" kaj staras por American Standard Kodo por Informado Interŝanĝo) estas kodo kiu konektas ĉiun karakteron al nombro inter 32 kaj 127. La nombroj malpli ol 32 referi al "unprintable" karakteroj, do ni ne estos uzi ilin.La majuskloj "Al" per "Z" havas la ASCII nombroj 65 tra 90. La minuskla literoj "a" tra "z" havas la ASCII nombroj 97 tra 122. La nombraj ciferoj "0" tra "9" havas la ASCII nombroj 48 tra 57.
32 | (Spaco) | 48 | 0 | 64 | @ | 80 | P | 96 | ` | 112 | p |
33 | ! | 49 | 1 | 65 | A | 81 | Q | 97 | oni | 113 | q |
34 | " | 50 | 2 | 66 | B | 82 | R | 98 | b | 114 | r |
35 | # | 51 | 3 | 67 | C | 83 | S | 99 | c | 115 | s |
36 | $ | 52 | 4 | 68 | D | 84 | T | 100 | d | 116 | t |
37 | % | 53 | 5 | 69 | E | 85 | Aŭ | 101 | TTT | 117 | u |
38 | & | 54 | 6 | 70 | F | 86 | V | 102 | f | 118 | v |
39 | ' | 55 | 7 | 71 | G | 87 | W | 103 | g | 119 | w |
40 | ( | 56 | 8 | 72 | H | 88 | X | 104 | h | 120 | x |
41 | ) | 57 | 9 | 73 | Mi | 89 | Y | 105 | i | 121 | y |
42 | * | 58 | : | 74 | J | 90 | Z | 106 | j | 122 | z |
43 | + | 59 | ; | 75 | K | 91 | [ | 107 | k | 123 | { |
44 | , | 60 | < | 76 | L | 92 | \ | 108 | l | 124 | | |
45 | - | 61 | = | 77 | M | 93 | ] | 109 | m | 125 | } |
46 | . | 62 | > | 78 | N | 94 | ^ | 110 | n | 126 | ~ |
47 | / | 63 | ? | 79 | Ho | 95 | _ | 111 | o |
Ekzemple, la litero "A" estas reprezentita de la nombro 65. La litero "m" estas reprezentita de la nombro 109. Tabulo de ĉiuj ASCII signojn el 32 al 12 estas en tabelo 14-1.
La chr () kaj Ord () Funkcioj
La chr () funkcio (prononcita "char", mallongigo de "signo") prenas entjero ASCII numeron por la parametro kaj redonas la sola karaktero ŝnuroj. La Ord () funkcio (mallongigo de "orda numeralo") prenas sola-karaktero ŝnuroj por la parametro, kaj redonas la entjero ASCII valoro por tiu signo. Provu tajpi la sekva en la interaga konko:
>>> Chr (65)
'A'
>>> Ord ('A')
65
>>> Chr (65 +8)
'Mi'
>>> Chr (52)
'4 '
>>> Chr (Ord ('F'))
'F'
>>> Ord (chr (68))
68
>>>
En la tria linio, chr (65 +8) taksas al chr (73). Se vi rigardas la ASCII tablo, vi povas vidi, ke 73 estas la orda por la majusklo "mi". En la kvina linio, chr (Ord ('F')) taksas al chr (70) kiu taksas al 'F'. Nutrado la rezulto de Ord () por chr () taksos la sama kiel la originalo argumento. Samo validas por nutri la rezulto de chr () por Ord (), kiel montrita per la sesa linio. 'A'
>>> Ord ('A')
65
>>> Chr (65 +8)
'Mi'
>>> Chr (52)
'4 '
>>> Chr (Ord ('F'))
'F'
>>> Ord (chr (68))
68
>>>
Uzanta chr () kaj Ord () venos en oportuna por nia Cezaro Cipher programo. Ili estas ankaŭ utila, kiam ni devas konverti kordoj al nombroj kaj numeroj kordojn.
Specimeno Run de Cezaro Cipher
Jen specimeno kuri de Cezaro Cipher programo, encrypting a message:
Ĉu vi volas kodi aŭ malĉifri mesaĝon?
ĉifri
Entajpu vian mesaĝon:
La ĉielo super la haveno estis la koloro de televido, agorditaj al mortinta kanalo.
Entajpu la klavo numero (1-26)
13
Via tradukita teksto:
Gur fxl nobir Gur cbeg jnf Gur pbybe bs gryrivfvba, gharq gb n qrnq punaary.
Nun ni kuros la programo kaj deĉifri la tekston, ke ni nur ĉifrita. ĉifri
Entajpu vian mesaĝon:
La ĉielo super la haveno estis la koloro de televido, agorditaj al mortinta kanalo.
Entajpu la klavo numero (1-26)
13
Via tradukita teksto:
Gur fxl nobir Gur cbeg jnf Gur pbybe bs gryrivfvba, gharq gb n qrnq punaary.
Ĉu vi volas kodi aŭ malĉifri mesaĝon?
deĉifri
Entajpu vian mesaĝon:
Gur fxl nobir Gur cbeg jnf Gur pbybe bs gryrivfvba, gharq gb n qrnq punaary.
Entajpu la klavo numero (1-26)
13
Via tradukita teksto:
La ĉielo super la haveno estis la koloro de televido, agorditaj al mortinta kanalo.
En ĉi tiu perspektivo provos malĉifri la teksto kiu estis kodita, sed ni uzas la malĝustan klavon. Memoru ke, se vi ne scias la korektan ŝlosilon, la deĉifrita teksto estos nur esti rubo datumoj. deĉifri
Entajpu vian mesaĝon:
Gur fxl nobir Gur cbeg jnf Gur pbybe bs gryrivfvba, gharq gb n qrnq punaary.
Entajpu la klavo numero (1-26)
13
Via tradukita teksto:
La ĉielo super la haveno estis la koloro de televido, agorditaj al mortinta kanalo.
Ĉu vi volas kodi aŭ malĉifri mesaĝon?
deĉifri
Entajpu vian mesaĝon:
Gur fxl nobir Gur cbeg jnf Gur pbybe bs gryrivfvba, gharq gb n qrnq punaary.
Entajpu la klavo numero (1-26)
15
Via tradukita teksto:
RFC qiw yzmtc RFC nmpr uyq RFC amjmp md rcjctgqgml, rslcb rm y bcyb afyllcj.
deĉifri
Entajpu vian mesaĝon:
Gur fxl nobir Gur cbeg jnf Gur pbybe bs gryrivfvba, gharq gb n qrnq punaary.
Entajpu la klavo numero (1-26)
15
Via tradukita teksto:
RFC qiw yzmtc RFC nmpr uyq RFC amjmp md rcjctgqgml, rslcb rm y bcyb afyllcj.
Cezaro Cipher la Fonta Kodo
Jen la fontkodon por Cezaro Cipher programo. Se vi ne volas tajpi ĉio ĉi kodo en, vi povas viziti cxi tiu libro de afiŝinto ĉe la URL http://inventwithpython.com/chapter14 kaj sekvu la instrukciojn por elŝuti la fontkodon. Post kiam vi tajpas ĉi tiun kodon en, savu la dosieron kiel cipher.py
cipher.py
Tiu kodo estas elŝutebla el http://inventwithpython.com/cipher.py
Se vi ricevas erarojn post tajpi tiun kodon en, kompari ĝin al la libro kodo kun la linio malsamoj ilo en http://inventwithpython.com/diff aŭ retpoŝtu la aŭtoro en al@inventwithpython.com
Tiu kodo estas elŝutebla el http://inventwithpython.com/cipher.py
Se vi ricevas erarojn post tajpi tiun kodon en, kompari ĝin al la libro kodo kun la linio malsamoj ilo en http://inventwithpython.com/diff aŭ retpoŝtu la aŭtoro en al@inventwithpython.com
- # Cezaro Cipher
- MAX_KEY_SIZE = 26
- def getMode ():
- dum Vera:
- presi ('Ĉu vi volas kodi aŭ malĉifri mesaĝon?')
- mode = input (). malsupreniri ()
- se modo en 'ĉifri TTT deĉifri d'. fendi ():
- revenu modo
- alie:
- print ('Tajpu aŭ "ĉifri" aŭ "e" aŭ "deĉifri" aŭ "d".')
- def getMessage ():
- print ('Entajpu vian mesaĝon:')
- reveno enigo ()
- def getKey ():
- ŝlosilo = 0
- dum Vera:
- print ('Tajpu la klavon nombro (1 -% s)'% (MAX_KEY_SIZE))
- ŝlosilo = int (enigo ())
- if (ŝlosila> = 1 kaj ŝlosilo <= MAX_KEY_SIZE):
- revenu ŝlosilon
- def getTranslatedMessage (modo, mesaĝo, ŝlosilo):
- se mode [0] == 'd':
- ŝlosilo =-klavo
- tradukita =''
- por simbolo en mesaĝo:
- se symbol.isalpha ():
- num = Ord (simbolo)
- num + = ŝlosilo
- se symbol.isupper ():
- se num> Ord ('Z'):
- num - = 26
- elif num <Ord ('A'):
- num + = 26
- elif symbol.islower ():
- se num> Ord ('z'):
- num - = 26
- elif num <Ord ('a'):
- num + = 26
- tradukita + = chr (num)
- alie:
- tradukita + = simbolo
- revenu tradukita
- mode = getMode ()
- mesaĝo = getMessage ()
- ŝlosilo = getKey ()
- print ('Via tradukita teksto:')
- print (getTranslatedMessage (modo, mesaĝo, ŝlosilo))
Kiel la Kodo Verkoj: Linioj 1 ĝis 34
Tiu kodo estas multe pli mallonga kompare al niaj aliaj ludoj. La ĉifrado kaj malĉifro procezoj estas la nur la dorsflanko de la alia, kaj eĉ tiam ankoraŭ dividas grandan parton de la sama kodo. Ni rigardu kiel ĉiu linio funkcias.- # Cezaro Cipher
- MAX_KEY_SIZE = 26
MAX_KEY_SIZE estas variablo kiu stokas la entjero 26 en ĝi. MAX_KEY_SIZE memorigas nin, ke en tiu programo, la ŝlosilo uzata en nia kodita devus esti inter 1 kaj 26.
Decidante ĉifri aŭ malĉifri
- def getMode ():
- dum Vera:
- presi ('Ĉu vi volas kodi aŭ malĉifri mesaĝon?')
- mode = input (). malsupreniri ()
- se modo en 'ĉifri TTT deĉifri d'. fendi ():
- revenu modo
- alie:
- print ('Tajpu aŭ "ĉifri" aŭ "e" aŭ "deĉifri" aŭ "d".')
Ĉi tiu funkcio estos redoni la unua gravulo en modo dum modo egalas al 'ĉifri', 'e', 'deĉifri', aŭ 'd'. Tio signifas, ke getMode () redonos la ĉenon 'e' aŭ ĉeno 'd'.
Havigo de la mesaĝo de la ludanto
- def getMessage ():
- print ('Entajpu vian mesaĝon:')
- reveno enigo ()
Ricevi la Ŝlosilo de la ludanto
- def getKey ():
- ŝlosilo = 0
- dum Vera:
- print ('Tajpu la klavon nombro (1 -% s)'% (MAX_KEY_SIZE))
- ŝlosilo = int (enigo ())
- if (ŝlosila> = 1 kaj ŝlosilo <= MAX_KEY_SIZE):
- revenu ŝlosilon
Ĉifri aŭ malĉifri la mesaĝo kun la Donita Ŝlosilo
- def getTranslatedMessage (modo, mesaĝo, ŝlosilo):
- se mode [0] == 'd':
- ŝlosilo =-klavo
- tradukita =''
La unua linio en la getTranslatedMessage () funkcio determinas se ni estas en kodita modo aŭ malĉifro modo. Se la unua letero en la modo variablo estas la ĉeno 'd', tiam ni estas en malĉifro modo. La sola diferenco inter la du modaloj estas kiu en malĉifro modo, la ŝlosilo estas metita al la negativa versio de sin. Se ŝlosilo estis la entjero 22, tiam en malĉifro modo ni starigis gxin al -22. La kialo por tiu ĉi estos klarigita poste.
Tradukis estas la ĉeno kiu tenos la fina rezulto: aŭ la ĉifrita teksto (se ni encrypting) aŭ la kompleta teksto (se ni decrypting). Ni nur povas concatenating kordoj al ĉi variablo, do ni unue gardi la malplenan ĉenon en tradukita. (A variablo devas esti difinita kun iuj kordoj valoron unue antaŭ ĉeno povas concatenados al ĝi.)
La isalpha () String Metodo
La isalpha () kordoj metodo revenos True se la kordo estas majuskla aŭ minuskla litero de A al Z. Se la cxeno enhavas neniun ne-letero signoj, tiam isalpha () revenos False. Provu tajpi la sekva en la interaga konko:
>>> 'Saluton'. Isalpha ()
Vera
>>> 'Kvardek du'. Isalpha ()
Falsaj
>>> 'Fortytwo'. Isalpha ()
Vera
>>> '42 '. Isalpha ()
Falsaj
>>>''. Isalpha ()
Falsaj
>>>
Kiel vi povas vidi, "Kvardek du '. Isalpha () revenos Falsa ĉar' Kvardek du 'havas spacon en ĝi, kiu estas ne-letero karaktero.' Fortytwo '. Isalpha () redonas Vera ĉar ĝi ne havas tiun spaco. '42 '. isalpha () False ĉar ambaŭ '4' kaj '2 'estas ne-letero gravuloj. Kaj''. Isalpha () estas False ĉar isalpha () nur redonas True se la kordo havas nur letero signoj kaj ne estas celo. Vera
>>> 'Kvardek du'. Isalpha ()
Falsaj
>>> 'Fortytwo'. Isalpha ()
Vera
>>> '42 '. Isalpha ()
Falsaj
>>>''. Isalpha ()
Falsaj
>>>
Ni uzos la isalpha () metodon en nia programo en la sekvaj linioj.
- por simbolo en mesaĝo:
- se symbol.isalpha ():
- num = Ord (simbolo)
- num + = ŝlosilo
La kialo ni havas la deklaron se on line 32 estas ĉar ni nur ĉifri / deĉifri literoj en la mesaĝo. Nombroj, signoj, interpunkcio markoj, kaj ĉio alia restos en siaj sen traduki formo. La num variablo tenos la entjera orda valoro de la letero stokitaj en simbolo. Linio 34 tiam "ŝanĝas" la valoron en num por la valoro en ŝlosilon.
La isupper () kaj islower () String Metodoj
La isupper () kaj islower () kordoj metodoj (kiu estas sur linio 36 kaj 41) laboro en maniero kiu estas tre simila al la isdigit () kaj isalpha () metodoj. Isupper () revenos True se la kordo oni nomas sur enhavas almenaŭ unu majuskla litero kaj neniu minuskla literoj. islower () redonas True se la kordo ĝi tuŝas enhavas almenaŭ unu minuskla litero kaj neniu majusklajn literojn. Alie ĉi tiuj metodoj reveni False. La ekzisto de ne-letero gravuloj kiel numeroj kaj spacoj ne influas la rezulton. Kvankam kordoj kiuj ne havas ajnan literoj, malplenan kordoj, ankaŭ revenos False. Provu tajpi la sekva en la interaga konko:
>>> 'HELLO'. Isupper ()
Vera
>>> 'Saluton'. Isupper ()
Falsaj
>>> 'Saluton'. Islower ()
Vera
>>> 'Saluton'. Islower ()
Falsaj
>>> 'LOOK OUT malantaŭ vi!'. Isupper ()
Vera
>>> '42 '. Isupper ()
Falsaj
>>> '42 '. Islower ()
Falsaj
>>>''. Isupper ()
Falsaj
>>>''. Islower ()
Falsaj
>>>
Vera
>>> 'Saluton'. Isupper ()
Falsaj
>>> 'Saluton'. Islower ()
Vera
>>> 'Saluton'. Islower ()
Falsaj
>>> 'LOOK OUT malantaŭ vi!'. Isupper ()
Vera
>>> '42 '. Isupper ()
Falsaj
>>> '42 '. Islower ()
Falsaj
>>>''. Isupper ()
Falsaj
>>>''. Islower ()
Falsaj
>>>
Kiel la Kodo Verkoj: Linioj 36 al 57
La procezo de encrypting (aŭ decrypting) ĉiu litero estas sufiĉe simpla. Ni volas apliki la saman Python kodon por ĉiu litero signo en la linio, kiu estas kion la sekvaj linioj de kodo fari.Encrypting aŭ Decrypting Ĉiu Letero
- se symbol.isupper ():
- se num> Ord ('Z'):
- num - = 26
- elif num <Ord ('A'):
- num + = 26
La vojo ni povas fari ĉi tion estas kontroli ĉu ŝlosilo havas valoron pli granda ol la plej granda ebla letero de ASCII valoro (kiu estas ĉefurbo "Z"). Se jes, tiam ni volas subtrahi 26 (ĉar estas 26 literoj en tuta) de num. Post fari ĉi tion, la valoro de num estas 68, kiu estas la ASCII valoron por 'D'.
- elif symbol.islower ():
- se num> Ord ('z'):
- num - = 26
- elif num <Ord ('a'):
- num + = 26
Se ni estus en decrypting modo, tiam ŝlosilo estus negativa. Tiam ni havus la speciala okazo kie num - = 26 povus esti malpli ol la plej malgranda ebla valoro (kiu Ord ('A'), tio estas, 65). Se ĉi tiu estas la kazo, ni volas aldoni 26 al num havi ĝin "envolver ĉirkaŭ".
- tradukita + = chr (num)
- alie:
- tradukita + = simbolo
- revenu tradukita
La Komenco de la Programo
- mode = getMode ()
- mesaĝo = getMessage ()
- ŝlosilo = getKey ()
- print ('Via tradukita teksto:')
- print (getTranslatedMessage (modo, mesaĝo, ŝlosilo))
Bruta forto
Tio estas la tuta Cezaro Cipher. Tamen, dum tiu kodita povas trompi iujn homojn, kiuj ne komprenas ĉifriko, ne observu mesaĝon sekreta de iu kiu scias ĉifranalitiko. Dum ĉifriko estas la scienco de fari kodoj, ĉifranalitiko estas la scienco de rompi kodoj.
Ĉu vi volas kodi aŭ malĉifri mesaĝon?
ĉifri
Entajpu vian mesaĝon:
Duboj povas ne esti agrabla, sed certeco estas absurda.
Entajpu la klavo numero (1-26)
8
Via tradukita teksto:
Lwcjba uig vwb JM xtmiaivb, jcb kmzbiqvbg eo ijaczl.
La tuta punkto de ĉifriko estas kiu do se iu alia ricevas siajn manojn
sur la ĉifrita mesaĝo, ili ne povas diveni la originalan unencrypted
mesaĝon el ĝi. Ni ŝajnigi ni estas la kodo breaker kaj ĉiuj ni havas estas la ĉifrita teksto: ĉifri
Entajpu vian mesaĝon:
Duboj povas ne esti agrabla, sed certeco estas absurda.
Entajpu la klavo numero (1-26)
8
Via tradukita teksto:
Lwcjba uig vwb JM xtmiaivb, jcb kmzbiqvbg eo ijaczl.
Lwcjba uig vwb JM xtmiaivb, jcb kmzbiqvbg eo ijaczl.
Unu metodo de ĉifranalitiko estas nomita bruta forto. Brute forto estas la tekniko de provi ĉiu sola ebla ŝlosilo. Se la criptoanalista konas la kodita ke la mesaĝo uzas (aŭ almenaŭ divenas ĝin), oni povas simple iri tra ĉiuj eblaj ŝlosilo. Ĉar estas nur 26 eblaj ŝlosiloj, estus facile por criptoanalista verki programon ol presaĵojn la deĉifrita ĉifrita teksto de ĉiu ebla ŝlosilo kaj vidi se iu el la eligoj sencon. Ni aldonu bruta forto trajto de nia programo.
Aldono de la Brute Forto Mode al Nia Programo
Unue, ŝanĝi linioj 7, 9, kaj 12 (kiu estas en la getMode () funkcio) kiu similis al la jenaj (la ŝanĝoj estas en bold):- def getMode ():
- dum Vera:
- presi ('Ĉu vi volas kodi aŭ malĉifri aŭ bruta forto mesaĝon?')
- mode = input (). malsupreniri ()
- se modo en 'ĉifri TTT deĉifri d malpura b'. split ():
- revenu mode [0]
- alie:
- print ('Tajpu aŭ "ĉifri" aŭ "e" aŭ "deĉifri" aŭ "d" aux "bruta" aŭ "b".')
- mode = getMode ()
- mesaĝo = getMessage ()
- se mode [0]! = 'b':
- ŝlosilo = getKey ()
- print ('Via tradukita teksto:')
- se mode [0]! = 'b':
- print (getTranslatedMessage (modo, mesaĝo, ŝlosilo))
- alie:
- por ŝlosila en gamo (1, MAX_KEY_SIZE + 1):
- print (ŝlosilon, getTranslatedMessage ('deĉifri', mesaĝo, ŝlosilo))
Tamen, se ne ni estas en "bruta forto" modo, kaj ni kuri getTranslatedMessage () buklo kiun iterates de 1 tuta vojo ĝis MAX_KEY_SIZE (kiu estas 26). Memoru ke kiam la gamo () funkcio redonas liston de entjeroj ĝis sed ne inkludante la dua parametro, tial ni havas + 1. Ĉi tiu programo estos presi ĉiun eblan tradukon de la mesaĝo (inkludante la ŝlosilo nombro uzata en la traduko). Jen specimeno kuri de ĉi modifita programo:
Ĉu vi volas kodi aŭ malĉifri aŭ bruta forto mesaĝon?
brutulo
Entajpu vian mesaĝon:
Lwcjba uig vwb JM xtmiaivb, jcb kmzbiqvbg eo ijaczl.
Via tradukita teksto:
1 Kvbiaz THF VINBERO il wslhzhua, Iris jlyahpuaf pZ hizbyk.
2 Juahzy sge tuz HK vrkgygtz, haz ikxzgotze oy ghyaxj.
3 Itzgyx RFD sty GJ uqjfxfsy, gzy hjwyfnsyd nx fgxzwi.
4 Hsyfxw qec RSX fi tpiewerx, fyx givxemrxc mw efwyvh.
5 Grxewv PDB qrw eh sohdvdqw, exw fhuwdlqwb lv devxug.
6 Fqwdvu ansero pqv DG rngcucpv, dwv egtvckpva ku cduwtf.
7 Epvcut nbz opu cf qmfbtbou, cvu dfsubjouz JT bctvse.
8 Duboj povas ne esti agrabla, sed certeco estas absurda.
9 Cntasr lzx MNS ad okdzrzms, ATS bdqszhmsx hr zartqc.
10 Bmszrq KYW lmr zc njcyqylr, zsr acpryglrw GQ yzqspb.
11 Alryqp jxv klq YB mibxpxkq, yrq zboqxfkqv fp xyproa.
12 Zkqxpo iwu jkp XA lhawowjp, xqp yanpwejpu eo wxoqnz.
13 Yjpwon hvt ijo WZ kgzvnvio, wpo xzmovdiot dn vwnpmy.
14 Xiovnm gus hino vy jfyumuhn, von wylnuchns cm uvmolx.
15 Whnuml ftr ghm ux iextltgm, unm vxkmtbgmr bl tulnkw.
16 Vgmtlk Movado fgl tw hdwsksfl, tml uwjlsaflq ak stkmjv.
17 Uflskj drp efk sv gcvrjrek, SLK tvikrzekp zj rsjliu.
18 Tekrji cqo Dej ru fbuqiqdj, rkj suhjqydjo yi qrikht.
19 Sdjqih bpn CDI qt eatphpci, qji rtgipxcin xh pqhjgs.
20 Rciphg AOM BCH ps dzsogobh, pih qsfhowbhm WG opgifr.
21 Qbhogf znl abg aŭ cyrnfnag, ohg pregnvagl VF nofheq.
22 Pagnfe ymk zaf nq bxqmemzf, ngf oqdfmuzfk ue mnegdp.
23 Ozfmed xlj yze mp awpldlye, mfe npceltyej td lmdfco.
24 Nyeldc wki xyd jen zvokckxd, gvidata mobdksxdi sc klcebn.
25 Mxdkcb vjh wxc kn yunjbjwc, kdc lnacjrwch Rb jkbdam.
26 Lwcjba uig vwb JM xtmiaivb, jcb kmzbiqvbg eo ijaczl.
Post rigardante super ĉiu vico, vi povas vidi, ke la 8a mesaĝo ne rubo, sed simpla angla lingvo! La criptoanalista povas dedukti, ke la originala ŝlosilo por ĉi ĉifrita teksto devis esti 8.
Tiu bruta forto estus malfacile fari reen en la tempo de Caesars kaj la
Roma Imperio, sed hodiaŭ ni havas komputilojn kiuj povas rapide iri tra
milionoj aŭ eĉ miliardojn da klavoj en mallonga tempo. Vi povas eĉ skribi programon kiu povas rekoni kiam trovis mesaĝon en la angla, por ke vi ne legis tra la tuta rubo tekston. brutulo
Entajpu vian mesaĝon:
Lwcjba uig vwb JM xtmiaivb, jcb kmzbiqvbg eo ijaczl.
Via tradukita teksto:
1 Kvbiaz THF VINBERO il wslhzhua, Iris jlyahpuaf pZ hizbyk.
2 Juahzy sge tuz HK vrkgygtz, haz ikxzgotze oy ghyaxj.
3 Itzgyx RFD sty GJ uqjfxfsy, gzy hjwyfnsyd nx fgxzwi.
4 Hsyfxw qec RSX fi tpiewerx, fyx givxemrxc mw efwyvh.
5 Grxewv PDB qrw eh sohdvdqw, exw fhuwdlqwb lv devxug.
6 Fqwdvu ansero pqv DG rngcucpv, dwv egtvckpva ku cduwtf.
7 Epvcut nbz opu cf qmfbtbou, cvu dfsubjouz JT bctvse.
8 Duboj povas ne esti agrabla, sed certeco estas absurda.
9 Cntasr lzx MNS ad okdzrzms, ATS bdqszhmsx hr zartqc.
10 Bmszrq KYW lmr zc njcyqylr, zsr acpryglrw GQ yzqspb.
11 Alryqp jxv klq YB mibxpxkq, yrq zboqxfkqv fp xyproa.
12 Zkqxpo iwu jkp XA lhawowjp, xqp yanpwejpu eo wxoqnz.
13 Yjpwon hvt ijo WZ kgzvnvio, wpo xzmovdiot dn vwnpmy.
14 Xiovnm gus hino vy jfyumuhn, von wylnuchns cm uvmolx.
15 Whnuml ftr ghm ux iextltgm, unm vxkmtbgmr bl tulnkw.
16 Vgmtlk Movado fgl tw hdwsksfl, tml uwjlsaflq ak stkmjv.
17 Uflskj drp efk sv gcvrjrek, SLK tvikrzekp zj rsjliu.
18 Tekrji cqo Dej ru fbuqiqdj, rkj suhjqydjo yi qrikht.
19 Sdjqih bpn CDI qt eatphpci, qji rtgipxcin xh pqhjgs.
20 Rciphg AOM BCH ps dzsogobh, pih qsfhowbhm WG opgifr.
21 Qbhogf znl abg aŭ cyrnfnag, ohg pregnvagl VF nofheq.
22 Pagnfe ymk zaf nq bxqmemzf, ngf oqdfmuzfk ue mnegdp.
23 Ozfmed xlj yze mp awpldlye, mfe npceltyej td lmdfco.
24 Nyeldc wki xyd jen zvokckxd, gvidata mobdksxdi sc klcebn.
25 Mxdkcb vjh wxc kn yunjbjwc, kdc lnacjrwch Rb jkbdam.
26 Lwcjba uig vwb JM xtmiaivb, jcb kmzbiqvbg eo ijaczl.
Resumo: Reviziante Nia Cezaro Cipher Programo
Komputiloj estas tre bona en fari matematiko. Kiam ni krei sistemon por traduki iun pecon de informo en nombroj (kiel ni faras kun teksto kaj ASCII aŭ kun spaco kaj koordinatsistemoj), komputilaj programoj povas procesi tiuj nombroj tre rapide kaj efike.Sed dum niaj Cezaro kodita programo tie povas ĉifri mesaĝojn kiuj gardos ilin sekrete homoj kiuj devas diveni ĝin per krajono kaj papero, ĝi ne observas gxin sekrete personoj kiuj scias kiel akiri komputiloj por prilabori informojn por ili. (Nia bruta forto mode pruvas tion.) Kaj estas aliaj ĉifrikaj ĉifroj, kiuj estas tiel antaŭita ke neniu scias malĉifri la sekreton mesaĝojn ili faras. (Krom la homo kun la ŝlosilo de kurso!)
Granda parto de elŝeligi kiel verki programon estas decidi kiel reprezenti la informon kiun vi volas manipuli kiel numeroj. Mi atendas ke ĉi tiu ĉapitro estas speciale montrita al vi kiel tio povas esti farita. La venonta ĉapitro prezentos nian lastan ludon, Reversi (ankaŭ konata kiel Otelo). La AI kiu ludas tiun ludon estos multe pli progresintaj ol la AI kiu ludis Tic Tac Toe en ĉapitro 9. Fakte, la AI estas tiel bona, ke vi trovos, ke la plimulto de la tempo vi ne povos venki ĝin!
Nenhum comentário:
Postar um comentário