View Single Post
Sitat av waf Vis innlegg
Eksempel, utfordring #2

Kode

ULFC://TXBYS.AKY.FLMG.FA/GSD/QM/GGXAEVDVFSRF?
Antall tegn samsvarer med "http://blogg.nsm.stat.no/ [...]", men jeg ser likevel ikke noe sammenheng for å finne noe løsning.
Kilde: http://blogg.nsm.stat.no/
Vis hele sitatet...
Jeg klarer ikke å se at du fikk hjelp på denne, så jeg prøver.

For det første har du allerede klart noe viktig: å gjette va svaret inneholder (den URL'en). Det er viktig, fordi du kan ved hjelp av den, finne nøkkelen som er brukt til å kryptere resten. Typen kryptering er Vigenère. Den består av Caesars kryptering på hver bokstav, med forskjellig antall hopp. Hoppene er bestemt av nøkkelen. Nøkkelen vil repeteres slik at den får samme lengde som URL'en.
OBSOBS! Vi bruker engelsk alfabet nå (uten æøå, lengde 26).

Kode

MELDING_ER_HER
NOKKELNOKKELNO
Måten nøkkelen bestemmer antall hopp er ved å se på posisjonen dens i alfabetet.

Kode

0 1 2 3 4 5 6 7
A B C D E F G H
En nøkkel ABC vil altså gjøre at krypteringen hopper i mønsteret 0, 1, 2 til høyre med caesars kryptering. Hvis vi nå skal kryptere meldingen "MELD" med nøkkelen "OOKK", gjør man slik:

Kode

M   E   L   D
O   O   K   K
----------
12  4  11   3
14 14  10  10
----------
Summer:
26 18 21 13
----------
Del på 26 og finn rest (for å "repetere" alfabetet), kjent som modulo (symbol: %):
0  18 21 13
----------
Bokstaver:
A  S  V  N

For å reversere dette, trekker man i fra meldingen i stedet.
(Modulo med negative tall blir addisjon, -14+26=12)

Kode

A - O = 0 - 14 = -14, -14%26 = 12   = M
S - O = 18- 14 = 4,     4%26 = 4    = E
osv.

Det du må passe på i denne oppgaven, er at de har utelatt ikke-alfabetiske tegn (:-/., osv.) når de har gjort dette. Så fjern dem før du prøver å repetere nøkkelen til meldingens lengde.


(tips: crypto er et av mine svakeste felt, så helst ikke diskuter/spør meg om slikt. Dette er et ganske enkelt nivå, det er derfor jeg har muligheten til å hjelpe med dette.)
Håper jeg forklarte det godt nok.

Siden det er sommerferie for meg nå, slenger jeg med en liten bonus:

En av funksjonene jeg kodet i python i dag, som lar deg bruke Vigenères kryptering. Den er lagd for å følge alfabetet, og ikke ASCII-tabellen, slik at abc kommer etter xyz, og ikke {|}. Jeg er ikke noen ekspert i python heller, så gjerne kom med forslag til forbedring eller nedkorting av koden min Skal funke på ihvertfall python 3.2 og 2.7.

Kode

def vig(instring, key, encrypt=True):
  '''Vigenere encryption which follows the alphabet instead of the ASCII table.\n\n Arguments:\n\tinstring\tMessage \t\t(string)\n\tkey\t\tKeyword \t\t(string)\n\tencrypt\n\t\t\tTrue  -> encrypt \t(boolean)\n\t\t\tFalse -> decrypt \t(boolean)'''
  keypad = ""
  outstr = ""
  codec = 1 if encrypt else -1
  for index, letter in enumerate(instring):
    keypad += key[index % len(key)]
  
  for index, letter in enumerate(instring):
    temp = ord(letter)
    if letter.isalpha():
      if letter.islower():
      
        temp = (((ord(letter)-97)+codec*(ord(keypad[index])-97))%26)+97
      else:
        temp = (((ord(letter)-65)+codec*(ord(keypad[index])-65))%26)+65
    elif letter.isdigit():
      temp (((ord(letter)-48)+codec*(ord(keypad[index])-48))%10)+48
    outstr += chr(temp)
  return outstr