Páginas

domingo, 3 de março de 2013

skribu-kun-python-cxap14


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 
La programo en ĉi tiu ĉapitro ne estas vere ludo, sed estas amuze ludi kun tamen. Nia programo igos normala Esperanto en sekreta kodo, kaj ankaŭ konverti sekretaj kodoj denove en regula angla denove. Nur iu, kiu estas informita pri sekretaj kodoj povos kompreni nian sekreton mesaĝoj.
Ĉ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.
Kiam ni ĉifri mesaĝon uzante kodita, ni elektos la ŝlosilo kiu estas uzata por kodi kaj deĉifri la mesaĝon. La ŝlosilo por nia Cezaro Cipher estos nombro de 1 al 26. Se vi ne konas la ŝlosilo (tio estas, scias la nombron), vi ne povos por deĉifri la ĉifrita mesaĝo.
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.
La nombro de spacoj ni ŝanĝi estas la ŝlosilo en la Cezaro Cipher. La ekzemplo pli supre montras la leteron tradukoj por la ŝlosilo 3.
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.
Tabelo 14-1: La ASCII Tabelo
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 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

Do, se ni volis ŝanĝi "A" por tri spacoj, ni unue konverti ĝin al nombro (65). Tiam ni aldonu 3 al 65, akiri 68. Tiam ni konverti la nombro 68 reen al letero ("D"). Ni uzos la chr () kaj Ord () funkcioj por konverti inter literoj kaj numeroj.
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.
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.
Ĉ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.
Ĉ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.

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
  1. # Cezaro Cipher

  2. MAX_KEY_SIZE = 26

  3. def getMode ():
  4. dum Vera:
  5. presi ('Ĉu vi volas kodi aŭ malĉifri mesaĝon?')
  6. mode = input (). malsupreniri ()
  7. se modo en 'ĉifri TTT deĉifri d'. fendi ():
  8. revenu modo
  9. alie:
  10. print ('Tajpu aŭ "ĉifri" aŭ "e" aŭ "deĉifri" aŭ "d".')

  11. def getMessage ():
  12. print ('Entajpu vian mesaĝon:')
  13. reveno enigo ()

  14. def getKey ():
  15. ŝlosilo = 0
  16. dum Vera:
  17. print ('Tajpu la klavon nombro (1 -% s)'% (MAX_KEY_SIZE))
  18. ŝlosilo = int (enigo ())
  19. if (ŝlosila> = 1 kaj ŝlosilo <= MAX_KEY_SIZE):
  20. revenu ŝlosilon

  21. def getTranslatedMessage (modo, mesaĝo, ŝlosilo):
  22. se mode [0] == 'd':
  23. ŝlosilo =-klavo
  24. tradukita =''

  25. por simbolo en mesaĝo:
  26. se symbol.isalpha ():
  27. num = Ord (simbolo)
  28. num + = ŝlosilo

  29. se symbol.isupper ():
  30. se num> Ord ('Z'):
  31. num - = 26
  32. elif num <Ord ('A'):
  33. num + = 26
  34. elif symbol.islower ():
  35. se num> Ord ('z'):
  36. num - = 26
  37. elif num <Ord ('a'):
  38. num + = 26

  39. tradukita + = chr (num)
  40. alie:
  41. tradukita + = simbolo
  42. revenu tradukita

  43. mode = getMode ()
  44. mesaĝo = getMessage ()
  45. ŝlosilo = getKey ()

  46. print ('Via tradukita teksto:')
  47. 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.
  1. # Cezaro Cipher

  2. MAX_KEY_SIZE = 26
La unua linio estas simple komento. Cezaro Cipher estas kodita de tipo de ĉifroj nomita simpla anstataŭo ĉifroj. Simpla anstataŭo ĉifroj estas koditaj kiu anstataŭas unu simbolon en la kompleta teksto per unu (kaj nur unu) simbolo en la ĉifrita teksto. Do se "G" estis anstataŭigita per "Z" en la kodita, ĉiu simpla "G" en la teksto estus anstataŭita per (kaj nur kun) "Z".
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

  1. def getMode ():
  2. dum Vera:
  3. presi ('Ĉu vi volas kodi aŭ malĉifri mesaĝon?')
  4. mode = input (). malsupreniri ()
  5. se modo en 'ĉifri TTT deĉifri d'. fendi ():
  6. revenu modo
  7. alie:
  8. print ('Tajpu aŭ "ĉifri" aŭ "e" aŭ "deĉifri" aŭ "d".')
La getMode () funkcio lasos la uzanto entajpu se ili volas kodi aŭ deĉifri la mesaĝon. La reveno valoro de enigo () (kiu tiam havas la malsupra () metodo vokis ŝin, kion redonas la minuskla versio de la kordoj) estas stokita en modo. La se aserto estas kondiĉo ĉekojn se la kordo stokitaj en modo ekzistas en la listo revenis por 'ĉifri TTT deĉifri d'. Split (). Tiu listo estas ['ĉifri', 'e', 'deĉifri', 'd'], sed estas pli facile por la programisto por ĝuste enmeti 'ĉifri TTT deĉifri d'. Split () kaj ne tipo en ĉiuj tiuj citaĵoj kaj komoj. Sed vi povas uzi kio ajn facila por vi, kaj ili ambaŭ taksi la sama listo valoro.
Ĉi tiu funkcio estos redoni la unua gravulo en modo dum modo egalas al 'ĉifri', 'e', 'deĉifri','d'. Tio signifas, ke getMode () redonos la ĉenon 'e' aŭ ĉeno 'd'.

Havigo de la mesaĝo de la ludanto

  1. def getMessage ():
  2. print ('Entajpu vian mesaĝon:')
  3. reveno enigo ()
La getMessage () funkcio simple ricevas la mesaĝon al kodi aŭ malĉifri de la uzanto kaj uzas ĉi kordoj kiel lia reveno valoro.

Ricevi la Ŝlosilo de la ludanto

  1. def getKey ():
  2. ŝlosilo = 0
  3. dum Vera:
  4. print ('Tajpu la klavon nombro (1 -% s)'% (MAX_KEY_SIZE))
  5. ŝlosilo = int (enigo ())
  6. if (ŝlosila> = 1 kaj ŝlosilo <= MAX_KEY_SIZE):
  7. revenu ŝlosilon
La getKey () funkcio permesas al la ludanto tipo en ŝlosila ili uzos por ĉifri aŭ deĉifri la mesaĝon. La dum buklo certigas ke la funkcio nur revenas validan ŝlosilon. Entajpu validan ŝlosilo tie estas tiu kiu estas inter la entjera valoroj 1 kaj 26 (memoru ke MAX_KEY_SIZE nur havos la valoron 26 ĉar ĝi estas konstanto). Ĝi tiam revenas ĉi ŝlosilo. Memoru ke on line 22 ke ŝlosilo estis fiksita al la entjera versio de kion la uzanto tajpas, kaj tiel getKey () redonas entjero.

Ĉifri aŭ malĉifri la mesaĝo kun la Donita Ŝlosilo

  1. def getTranslatedMessage (modo, mesaĝo, ŝlosilo):
  2. se mode [0] == 'd':
  3. ŝlosilo =-klavo
  4. tradukita =''
getTranslatedMessage () estas la funkcio kiu faras la encrypting kaj decrypting en nia programo. Ĝi havas tri parametrojn. Mode aroj la funkcio ĉifrado modo aŭ malĉifro modo. Mesaĝo estas la kompleta teksto (aŭ ĉifrita teksto) esti ĉifrita (aŭ deĉifrita). Ŝlosilo estas la ŝlosilo kiu estas uzata en ĉi tiu ĉifro.
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.
Ni uzos la isalpha () metodon en nia programo en la sekvaj linioj.
  1. por simbolo en mesaĝo:
  2. se symbol.isalpha ():
  3. num = Ord (simbolo)
  4. num + = ŝlosilo
Linio 31 informoj por buklo iterates super ĉiu litero (memoras en ĉifriko estas nomitaj simboloj) en la mesaĝo kordoj. En a por ciklo, kordoj estas traktita nur kiel listoj de simpla karaktero ŝnuroj. Se mesaĝon havis la ĉeno 'Saluton', tiam por simbolo en 'Saluton' estus la samaj kiel por simbolo en ['H', 'e', 'l', 'l', 'o']. Sur ĉiu ripeto tra tiu ciklo, simbolo havos la valoron de letero en mesaĝo.
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
>>>

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

  1. se symbol.isupper ():
  2. se num> Ord ('Z'):
  3. num - = 26
  4. elif num <Ord ('A'):
  5. num + = 26
Tiu kodo kontrolas se la simbolo estas majuskla litero. Se jes, estas du specialaj kazoj ni devas zorgi pri. Kio se simbolo estis 'Z' kaj ŝlosilo estis 4? Se tio estis la kazo, la valoro de num tie estus la karaktero '^' (La orda de '^' estas 94). Sed ^ ne estas litero ajn. Ni volis ke la ĉifrita teksto al "envolver ĉirkaŭ" al la komenco de la alfabeto.
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'.
  1. elif symbol.islower ():
  2. se num> Ord ('z'):
  3. num - = 26
  4. elif num <Ord ('a'):
  5. num + = 26
Se la simbolo estas minuskla litero, la programo kuras kodo kiu estas tre simila al linioj 36 tra 40. La sola diferenco estas, ke ni uzu Ord ('z') kaj Ord ('a') anstataŭ Ord ('Z') kaj Ord ('A').
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ŭ".
  1. tradukita + = chr (num)
  2. alie:
  3. tradukita + = simbolo
La tradukita ĉeno estos aldonita kun la ĉifrita / deĉifrita karaktero. Se la simbolo estis ne majuskla aŭ minuskla litero, tiam la alia-bloko on line 48 estus ekzekutita anstataŭe. Ĉiuj kodo en la alia-bloko ne estas aldonas la originalo, sen traduki simbolo por la tradukita ĉeno. Tio signifas, ke spacoj, nombroj, interpunkcio markoj, kaj aliaj gravuloj ne estos ĉifrita aŭ deĉifrita.
  1. revenu tradukita
La lasta linio en la getTranslatedMessage () funkcio redonas la tradukita ĉeno.

La Komenco de la Programo

  1. mode = getMode ()
  2. mesaĝo = getMessage ()
  3. ŝlosilo = getKey ()

  4. print ('Via tradukita teksto:')
  5. print (getTranslatedMessage (modo, mesaĝo, ŝlosilo))
Ĉi tiu estas la ĉefa parto de nia programo. Ni nomas ĉiu el la tri funkcioj ni difinis pli supre laŭvice por ricevi la modo, mesaĝo, kaj ŝlosilo kiu la uzanto volas uzi. Ni tiam pasas tiuj tri valoroj kiel argumentoj al getTranslatedMessage (), kies revenon valoro (la tradukita ĉeno) estas presita al la uzanto.

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:
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):
  1. def getMode ():
  2. dum Vera:
  3. presi ('Ĉu vi volas kodi aŭ malĉifri aŭ bruta forto mesaĝon?')
  4. mode = input (). malsupreniri ()
  5. se modo en 'ĉifri TTT deĉifri d malpura b'. split ():
  6. revenu mode [0]
  7. alie:
  8. print ('Tajpu aŭ "ĉifri" aŭ "e" aŭ "deĉifri" aŭ "d" aux "bruta" aŭ "b".')
Tio ni elektu "bruta forto" kiel modo por nia programo. Tiam modifi kaj aldonu la sekvajn ŝanĝojn al la ĉefa parto de la programo:
  1. mode = getMode ()
  2. mesaĝo = getMessage ()
  3. se mode [0]! = 'b':
  4. ŝlosilo = getKey ()

  5. print ('Via tradukita teksto:')
  6. se mode [0]! = 'b':
  7. print (getTranslatedMessage (modo, mesaĝo, ŝlosilo))
  8. alie:
  9. por ŝlosila en gamo (1, MAX_KEY_SIZE + 1):
  10. print (ŝlosilon, getTranslatedMessage ('deĉifri', mesaĝo, ŝlosilo))
Tiuj ŝanĝoj fari nian programon peti la uzanto por ŝlosila se ili ne estas en "bruta forto" modo. Se ili ne estas en "bruta forto» Modo, tiam la originala getTranslatedMessage () alvoko estas farita kaj la tradukita kordoj estas presita.
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.

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