Historialliset Salaimet

Tässä osiossa tarkastelemme, miten kolme klassista substituutioon perustuvaa salainta toimivat. Näissä substituutiosalaimissa enkryptaus on salausalgoritmi ja dekryptaus purkualgoritmi. Kaksi esiteltävistä salaimista käyttää avainta. Kaikilla kolmella esiteltävällä salaimella tavoitellaan luottamuksellisuutta.


Atbash

Ensimmäinen esimerkki historiallisesta substituutiosalaimesta on heprealainen Atbash-korvaussalain.

Tiedon salauksen eli luottamuksellisuuden lisäksi Atbash-korvaussalaimella on pyritty tuomaan mystisyyden vaikutelmaa raamatullisten tekstien tulkintaan. Atbash sisältää salaus- (enkoodaus) ja purkumenetelmät (dekoodaus).

Atbash-korvaussalaimella selväteksti salataan, ja salateksti puretaan korvaamalla kirjaimet aakkosten järjestykseen perustuvalla algoritmilla. Substituutiossa aakkosten ensimmäinen merkki korvataan viimeisellä, toisena oleva merkki toiseksi viimeisellä ja niin edelleen. Suomen kielessä selvätekstin A-kirjaimesta tulee salakielen Ö-kirjain, selväkielen B-kirjaimesta salakielen Ä-kirjain, ja niin edelleen.

Voimme kuvata lähtöjoukon elementit maalijoukon elementeiksi seuraavan kuvan havainnollistamalla tavalla.

../_images/l3_atbash.png

Tietokoneella aakkosten indeksointi aloitetaan yleensä nollasta. Tähän indeksoinnin tapaan kannattaa heti totuttautua. Ensimmäiseen aakkoston merkkiin viitataan numerolla nolla.

Suomen kielen aakkostossa on 29 merkkiä. Merkkien määrää kuvataan symbolilla m. Suomessa \(m=29\) . Suomen kielessä ’A’-kirjaimen indeksi on nolla ja viimeisen ’Ö’-kirjaimen indeksi 28. Indeksi menee siis nollasta \(m-1\) :een. Matemaattisesti ilmaisemme indeksille i sallitut arvot seuraavasti:

\[\{i : i \in \mathbb{Z}, 0 \leq i \leq (m-1)\}\]

Seuraavassa taulukossa on suomen aakkoston Atbash-algoritmi korvaustauluna (indeksointi nollasta).

indeksi

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

selväteksti

A

B

C

D

E

F

G

H

I

J

K

L

M

N

O

P

Q

R

S

T

U

V

W

X

Y

Z

Å

Ä

Ö

salateksti

Ö

Ä

Å

Z

Y

X

W

V

U

T

S

R

Q

P

O

N

M

L

K

J

I

H

G

F

E

D

C

B

A

Jos käytetty aakkosto sisältää parittoman määrän merkkejä, korvaustaulun keskelle osuu yksi kirjain, joka on sama selväkielessä että salakielessä. Tästä esimerkkinä suomen aakkoston Atbash-substituutiotaulu, jossa indeksillä 14 oleva kirjain O on sama selväteksissä ja salatekstissä.


Atbash-laskeminen

Atbash-korvaussalaimen salaus- ja purkuoperaatiot lasketaan samalla yhtälöllä. Salauksen \(E\) (engl. encryption) ja purun \(D\) (engl. decryption) yhtälöt ovat samat. Käyttämällämme indeksointitavalla substituutiofunktio voidaan kuvata yhtälönä, jossa x on muunnettavan merkin indeksi ja m on joukon merkkien määrä.

Salaus/enkoodaus: \(E(x) = -(x+1)\pmod{m}\)
Purku/dekoodaus : \(D(x) = -(x+1)\pmod{m}\)

Atbash-yhtälössä käytetään juuri oppimaamme moduloaritmetiikkaa.

Seuraavassa esimerkissä lasketaan Atbash-salaus suomen kielen kirjaimelle C, jolla on indeksi x=2. Atbash-menetelmällä salatun merkin indeksi lasketaan seuraavasti:

\[\begin{split}\begin{align} & -(2+1)\pmod{29}\\ & = -3\pmod{29}\\ & = -1 \cdot 29 + 26\\ & = 26 \end{align}\end{split}\]

Salakielen merkin indeksiksi tulee 26 eli se on ’Å’-merkki. Tämä nähdään myös aiemmin esitetystä Atbash-korvaustaulusta.

Pura Atbash-salaimella tuotetun salakielen merkki V joko päässälaskuna tai käyttämällä kynää ja paperia. Merkin ’V’ indeksi on 21. Laskenta menee samalla tavalla kuin aiemmin C-merkin tapauksessa, sillä salaus ja purku käyttävät samaa yhtälöä. Kun olet suorittanut modulolaskennan, vastaa alla oleviin kysymyksiin.

Mikä seuraavista on algoritmin ensimmäisen vaiheen välitulos?

Mikä on edellisen negatiivisen luvun \(\pmod{29}\)?


Atbash-koodiesimerkit

Käytetään nyt valmista Atbashin Python-funktiota, jolle annetaan parametriksi esikäsitelty viesti.

Käytetään viestinä: Kahvi Charlotassa on hyvää ja vahvaa. Ensin viesti esikäsitellään merkkijonomuotoon: KAHVICHARLOTASSAONHYVÄÄJAVAHVAA. Lopuksi viesti salataan Atbash-korvaussalaimella.

Inactive
# Otetaan käyttöön funktiot atbash, esikäsittely ja merkistöjen luonti
from xip import atbash, esikasittele_teksti, merkistot

# Otetaan käyttöön suomen kielen isot ja pienet aakkoset
isot, pienet = merkistot(suomi=True)
print("Isot  :", isot)
print("Pienet:", pienet)

# Viesti joka salataan tai puretaan, voit laittaa viestiin Atbash tehtävien viestin.
viesti = "Kahvi Charlotassa on hyvää ja vahvaa!"
esikäsitelty_viesti=esikasittele_teksti(viesti, isot+pienet)

print("Alkuperäinen viesti    : {}".format(viesti))
print("Esikäsitelty viesti    : {}".format(esikäsitelty_viesti))
print("Atbash salattu viesti  : {}".format(atbash(esikäsitelty_viesti)))

Olet saanut haltuusi Atbash-salatun tekstin: KIOQUJBEJJUKÖJÖHIOJJÖHIOPPÖJIVÖJEVZYSKBPKÖJÖÖKYUJKYQBPJOUKJÖOPPYÖKIOQU.

Sinulla on kaksi tapaa selvittää viesti:

  1. käytät aiemmin kuvattua käännöstaulua

  2. kopioit salatun tekstin edelliseen koodisoluun viestiksi, eli muuta edellisen koodin viesti-rivin sisältö seuraavaksi:

viesti = "KIOQUJBEJJUKÖJÖHIOJJÖHIOPPÖJIVÖJEVZYSKBPKÖJÖÖKYUJKYQBPJOUKJÖOPPYÖKIOQU"

Mitä tekstissä lukee selväkielellä?

Selväkieli on:

Kyseessä on symmetrinen salaus ilmain avainta. Mitkä seuraavista ovat totta?

Voit käyttää oheisia koodisoluja seuraavan tehtävän suorittamiseksi:

Inactive
# Otetaan käyttöön funktiot atbash, esikäsittely ja merkistöjen luonti
from xip import atbash, esikasittele_teksti, merkistot
isot, pienet = merkistot(suomi=True)

# Voit halutessasi vaihtaa tähän oman viestin
viesti = "SauliHilla"

esikäsitelty_viesti=esikasittele_teksti(viesti, isot+pienet)
print("Alkuperäinen viesti    : {}".format(viesti))
print("Esikäsitelty viesti    : {}".format(esikäsitelty_viesti))
print("Atbash salattu viesti  : {}".format(atbash(esikäsitelty_viesti)))
Inactive
# Otetaan käyttöön funktiot atbash, esikäsittely ja merkistöjen luonti
from xip import atbash, esikasittele_teksti, merkistot
isot, pienet = merkistot(suomi=True)

# Voit vaihtaa tähän oman viestin
viesti = "SauliJoukahainen"

esikäsitelty_viesti=esikasittele_teksti(viesti, isot+pienet)
print("Alkuperäinen viesti    : {}".format(viesti))
print("Esikäsitelty viesti    : {}".format(esikäsitelty_viesti))
print("Atbash salattu viesti  : {}".format(atbash(esikäsitelty_viesti)))

Meillä on kaksi selväkielistä viestiä, joissa viestin sisältö muodostuu viestin lähettäjän ja vastaanottajan nimestä.

Kun Sauli lähettää viestin Hillalle, viesti on: ”SauliHilla”.

Kun Sauli lähettää viestin Joukahaiselle, viesti on ”SauliJoukahainen”.

Voit käyttää kahta yllä olevaa koodisolua tehtävän tekemiseen. Kun olet ajanut koodin ja tuottanut kaksi salatekstiviestiä, vastaa seuraaviin väittämiin.

Valitse seuraavasta oikeat vaihtoehdot.

Klassisten salainten yksi heikkous on yllä olevassa esimerkissäkin nähty selväkielisen informaation suora verrattavuus salakieleen. Tällöin esimerkissämme oleva sama merkkijono ”Sauli” kuvautuu täsmälleen samaksi salakielen merkkijonoksi ”KÖIRU”. Tällaisen salaimen avaimen selvittäminen ei ole kovin vaikeaa.

Sama ongelma on vastassa jos moderneja salaimia käyttää väärin. Myös ne tuottavat tunnistettavia selväkieli-salakieli pareja. Aivan pian opimme miten lisäämme satunnaisuutta hallitusti vaikeuttaaksemme salakielen tai avaimen murtamista eli kryptoanalyysiä.

Kehystarinamme Alice ja Bob käyttävät myös Atbash-salainta viestien suojaamiseen. Seuraavassa tehtävässä sinun on osattava käyttää Atbash-salainta joko käsin tai koodiesimerkkiä muuttamalla.

Alice päättää muistuttaa Bobia heidän suunnitelmastaan ja lähettää Bobille Atbash-salatun viestin. Tehtävänäsi on selvittää, mitä Alicen viestissä lukee.

Salateksti on: VYUÄOÄNUJBUKSAQYUZBPKIIPPUJYRRÖÅÖLORUPKEPJJBLUYJBVIOQYPPÖQIIJYPKÖJÖÖQIUKJÖKÖJYYPHÖLTO .

Voit selvittää viestin joko käsin tai käyttämällä aiemmin annettuja koodeja muuttamalla koodin viesti-riviä:

viesti = "VYUÄOÄNUJBUKSAQYUZBPKIIPPUJYRRÖÅÖLORUPKEPJJBLUYJBVIOQYPPÖQIIJYPKÖJÖÖQIUKJÖKÖJYYPHÖLTO"

Valitse seuraavista väittämistä oikea.

Mitä dekryptatussa viestissä lukee? Voit valita useamman vaihtoehdon.


Caesar-salaus

Julius Caesar (Gaius Iulius Caesar) oli roomalainen hallitsija, joka eli vuosina 100-44 ennen ajanlaskun alkua.

Elämänsä aikana hän valloitti silloisen Rooman kanssa kilpailevia valtioita edistyksellisten roomalaisten sotavoimien ja infrastruktuurin ansiosta. Julius Caesarin väitetään ohjanneen sotavoimiaan salatuilla viesteillä.

Caesar-salaimella tavoitellaan viestien luottamuksellisuutta. Salaus- ja purku-algoritmit käyttävät ennaltamäärättyä aakkostoa ja avainta. Juuri äsken opitussa Atbash-salaimessa ei ollut käytössä avainta.

Caesar-salaimessa avain kertoo salausalgorimille suhteellisen etäisyyden selvätekstin merkin ja salatekstin merkin välillä aakkostossa. Historiallinen Caesarin käyttämä salaus käytti kiinteästi määritettyä avainta, joka tarkoitti aakkoston siirroksen suuruutta. Avaimeksi oli Caesar-salaimessa sovittu arvo kolme (3). Tällöin salaimessa selväkielen merkki korvataan sillä merkillä, joka on kolme askelta aakkostossa ”eteenpäin”. Esimerkiksi ’A’ merkki korvataan merkillä ’D’, ’B’ merkki korvataa merkillä ’E’ ja niin edelleen.

Tätä substituutio-funktiota, joka ottaa korvauksen tietyn etäisyyden päässä olevasta taulukosta, merkitään symbolilla >>.

Suoritamme enkoodauksen:

  • Selväkielen salattava tieto on A-kirjain.

  • Caesar-salaimen käyttämä avain on luku \(3\).

  • Aakkoston koko on 29 merkkiä, jolloin äärellisen kuntamme koko on \(\pmod{29}\)

  • Caesar-salain tuottaa salakielen avaimella \(3\) salakieleksi D-kirjaimen

Edelliset toimenpiteet merkitään yleensä seuraavalla lyhyellä merkintätavalla:

’A’>>3 => ’D’ \(\pmod{29}\)

Kuten substituution ja permutaation yhteydessä visualisoimme funktioiden toiminnan, voimme visualisoida nyt esitettyjen lähtö- ja maalijoukkojen ja funktion toiminnan. Visualisoinnista näemme miten lähtöjoukon elementit kuvautuvat maalijoukon elementeiksi.

../_images/l3_caesar.png

Substituutiota ei tarvitse välttämättä laskea, vaan voimme luoda korvaustaulun selvä- ja salatekstien välille samoin kuin Atbash-salaimelle. Seuraavassa on esitettynä suomalaisten aakkosten Caesar-korvaustaulu:

indeksi

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

selväteksti

A

B

C

D

E

F

G

H

I

J

K

L

M

N

O

P

Q

R

S

T

U

V

W

X

Y

Z

Å

Ä

Ö

salateksti

D

E

F

G

H

I

J

K

L

M

N

O

P

Q

R

S

T

U

V

W

X

Y

Z

Å

Ä

Ö

A

B

C


Vastaavasti purku tapahtuu korvaamalla salatekstin merkki aakkostossa kolme merkkiä aiemmin olevalla merkillä. Tätä siirtoa merkitään symbolilla ’<<’. Esimerkiksi salatekstin merkkin ’A’ dekoodaus selvätekstiksi merkitään

’A’<<3 => ’Å’ \(\pmod{29}\) .

Harjoitellaan Caesar-salausta käsin. Salataan ensin viesti ”OK” suomen kielen aakkostolla siten, että avain=3. Viestin merkit korvautuvat seuraavasti:

  • ’O’>>3 => ’R’

  • ’K’>>3 => ’N’.

Salaviestiksi saamme tekstin ”RN”. Puretaan salateksti ”RN” samalla aakkostolla ja avaimella. Tällöin:

  • ’R’<<3 => ’O’

  • ’N’<<3 => ’K’.

Näin olemme saaneet palautettua alkuperäisen viestin ”OK”.


Caesar-salaimen koodiesimerkit

Kokeillaan Caesar-salausta valmiilla Python-funktiolla. Salataan ensin viesti ”HEI” ja tämän jälkeen puretaan salattu viesti. Käytämme salaimia, joille annetaan viestin lisäksi käytetty aakkosto, avain sekä ohje, onko kyseessä viestin salaaminen vai purku.

Inactive
from xip import caesar, merkistot, esikasittele_teksti
isot, pienet = merkistot(suomi=True)
viesti = "HEI"
esikäsitelty_viesti = esikasittele_teksti(viesti, isot+pienet)

print("Alkuperäinen viesti  :", viesti)
print("Esikäsitelty viesti  :", esikäsitelty_viesti)

# Asetetaan avain = 3 – jos avainta ei anneta, funktio käyttää oletusarvona avaimen arvoa 3
# Asetetaan aakkosto = isot – jos aakkostoa ei anneta, oletetaan suomenkielen aakkoset
# Asetetaan purku-lippu = false, joka kertoo, että olemme salaamassa, emme purkamassa viestiä.

# Suoritetaan Caesar-salaus edellisillä arvoilla
salateksti=caesar(esikäsitelty_viesti, aakkosto=isot, avain=3, purku=False)
print("Caesar salateksti on :", salateksti)

# Suoritetaan salauksen purku asettamalla purkulippu arvoon True
dekoodattu_teksti=caesar(salateksti,aakkosto=isot, avain=3, purku=True)
print("Caesar dekoodattu on :", dekoodattu_teksti)

Käsitellään vastaavasti referenssiviestimme Kahvi Charlotassa on hyvää ja vahvaa!

Inactive
from xip import caesar, merkistot, esikasittele_teksti
isot, pienet = merkistot(suomi=True)

viesti='Kahvi Charlotassa on hyvää ja vahvaa!'
esikäsitelty_viesti = esikasittele_teksti(viesti, isot+pienet)

print("Alkuperäinen viesti  :", viesti)
print("Esikäsitelty viesti  :", esikäsitelty_viesti)

# Asetetaan avain = 3
# Asetetaan aakkosto = isot
# Asetetaan purku-lippu = false, joka kertoo, että olemme salaamassa viestin.

# Suoritetaan Caesar-salaus edellisillä arvoilla
salateksti=caesar(esikäsitelty_viesti,aakkosto=isot, avain=3, purku=False)
print("Caesar salateksti on :", salateksti)

# Suoritetaan salauksen purku asettamalla purkulippu arvoon True
dekoodattu_teksti=caesar(salateksti,aakkosto=isot, avain=3, purku=True)
print("Caesar dekoodattu on :", dekoodattu_teksti)

Olet saanut haltuusi viestin PYATWCXTACWTBLVLBLWDTBCWT, jonka tiedät olevan salattu Caesar-salaimella. Olet kirjoittanut Pythonilla for-silmukan, jolla voi testata kaikki eri avainpituudet. Aja tehtävän alta löytyvä koodisolu ja vastaa seuraaviin kysymyksiin.

Avain jolla viesti aukeaa on:

Valitse kaikki oikeat vaihtoehdot. Selväkielinen viesti on:

Inactive
from xip import caesar, merkistot, esikasittele_teksti
isot, pienet = merkistot(suomi=True)

viesti='PYATWCXTACWTBLVLBLWDTBCWT'    # Viesti joka salataan tai puretaan
esikäsitelty_viesti = esikasittele_teksti(viesti, isot+pienet)

print("Alkuperäinen viesti  :", viesti)
print("Esikäsitelty viesti  :", esikäsitelty_viesti)

# Käytetään Caesar-salainta for-silmukassa
for avain in range(len(isot)):
  tulos=caesar(esikäsitelty_viesti,aakkosto=isot, avain=avain, purku=True)
  print(f"Avaimella: {avain} tulos on :{tulos}")

Bob lähettää viestin Alicelle. Seuraavaksi pieni tehtävä kehystarinamme henkilöillä.

Bob lähettää Alicelle viestin Caesar-salattuna. Viesti on: BÄCXFCZÄECCNIMEOHPXLICNCNMXNÄÄMNXGCMNVBVHGXEÄXMNXZXLIFNSEEVCMC.

Bob ei kuitenkaan käytä avaimena heidän sopimaansa avainta 3, vaan salaa viestin Carolin syntymäpäivällä eli yhdellä numeroista 1 - 31.

Tehtävänäsi on selvittää, mikä on Carolin syntymäpäivä (eli avain) ja mitä viestissä sanotaan.

Voit yrittää purkaa viestin salausta kokeilemalla annettuja avaimia käsin tai muokkaamalla alempana annettua koodia.

Seuraavista koodiriveistä voi olla apua, kun muokkaat koodia:

for avain in range(1,32):

ja

viesti = "BÄCXFCZÄECCNIMEOHPXLICNCNMXNÄÄMNXGCMNVBVHGXEÄXMNXZXLIFNSEEVCMC"

Carolin syntymäpäivä on:

Valitse kaikki oikeat vaihtoehdot. Mitä Bob sanoo puretussa viestissä?

Inactive
from xip import caesar, merkistot, esikasittele_teksti
isot, pienet = merkistot(suomi=True)

# Muuta seuraavan rivin viesti tehtävänannon mukaisesti
viesti='laita tähän tehtävän viesti'
esikäsitelty_viesti = esikasittele_teksti(viesti, isot+pienet)

print("Alkuperäinen viesti  :", viesti)
print("Esikäsitelty viesti  :", esikäsitelty_viesti)

# Käytetään Caesar-salainta tee tästä for-silmukka kuten edellisessä koodissa
# Nyt koodi avaa vain avaimella 31 salatun tiedon, kokeile avaimet yksittäin
# Tai tee for-silmukka TAI selvitä tehtävä käsin.

avain = 31
tulos=caesar(esikäsitelty_viesti,aakkosto=isot, avain=avain, purku=True)
print(f"Avaimella: {avain} tulos on :{tulos}")

Vigenère-salaus

Viimeinen substituutioon perustuva salaus johon tutustumme, on Vigenère. Salain perustuu samanlaiseen substituutioon kuin Caesar-salaus. Menetelmien ero syntyy avaimessa. Vigenèren avain voidaan kuvitella asetettavan allekkain viestin kanssa. Jos avain on lyhyempi kuin viesti, avainta toistetaan kunnes viesti on mahdollista salata. Jos avain on yhtä pitkä kuin viesti, jokaiselle viestin kirjaimelle muodostuu oma substituutio. Katsomme tätä erikoistapausta seuraavassa luvussa.

Katsotaan esimerkin kautta Vigenèren toimintaa: salataan selvätekstinen viesti: ”TÄYSI” käyttäen avainta ”OLI”.

Avain kohdistetaan viestiin ja jos avain loppuu kesken, aloitetaan avaimen merkkejä käyttämään uudestaan alusta. Avaimemme ’OLI’ alkaa siis toistamaan itseään viestin neljännen merkin kohdalla.

Lyhyt avain:

selväviesti

T

Ä

Y

S

I

avain

O

L

I

O

L


Seuraavaksi lasketaan jokaisen viestin merkin indeksi. Indeksi kertoo merkin paikan aakkostossa.

indeksi

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

selväteksti

A

B

C

D

E

F

G

H

I

J

K

L

M

N

O

P

Q

R

S

T

U

V

W

X

Y

Z

Å

Ä

Ö


Viestin merkkien indeksit aakkostossa ovat:

  • T => 19

  • Ä => 27

  • Y => 24

  • S => 18

  • I => 8

Tämän jälkeen poimitaan avaimen kirjaimien indeksit:

  • O => 14

  • L => 11

  • I => 8

Salaus suoritetaan korvaamalla viestin merkki avaimen indeksin osoittaman askeleen etäisyydellä olevalla aakkoston merkillä. Katsotaan miten ensimmäinen merkki korvataan:

  • Viestimme on TÄYSI`

  • Avain on OLI`

  • Ensimmäisen merkin T indeksi on 19.

  • Avaimena toimivan kirjaimen O indeksi on 14.

  • Suoritetaan siirros, eli lasketaan indeksit yhteen. Saadaan 33.

  • Aakkostossa on 29 merkkiä, jolloin kuntamme koko on 29 elementtiä. Tällöin laskemme siirroksen luvusta \(33\pmod{29}=4\).

  • Salatun kirjamen indeksi on 4, eli E-kirjain.

Seuraavassa salattavan viestin kirjain on Ä`=>27, avaimena kirjain `L`=>11, joiden summa 38, josta :math:pmod{29}` => 9, eli salakieleksi tulee J-merkki. Näin jatketaan kaikkien merkkien salaus.

Seuraava taulukko havainnollistaa, miten sana ”TÄYSI” salaataan avaimella ”OLI” käyttäen Vigenère-salainta.

selväviesti

T ~ 19

Ä ~ 27

Y ~ 24

S ~ 18

I ~ 8

avain

O >>14

L >>11

I >>8

O >>14

L >>11

indeksi i

19 + 14

27 + 11

24 + 8

18 + 14

8 + 11

i \(\pmod{29}\)

4 ~ E

9 ~ J

3 ~ D

3 ~ D

21 ~ V

salaviesti

E

J

D

D

T

Korvaus toimii siis kuten Caesar-salaimessa, mutta substituution siirros perustuu avaimen kirjaimeen. Jos aakkoston ”reuna” tulee vastaan, jatketaan samalla tavalla kuten Caesar-salauksessa aakkoston alkupäästä eli moduloaritmetiikalla. Dekryptaus eli viestin purkaminen suoritetaan vastaavalla tavalla.

Edellisessä esimerkissä huomataan, että salaviestiin voi tulla kaksi samaa merkkiä, vaikka selväviestissä ei esiinny kahta samaa kirjainta. Jos avain on huomattavasti lyhyempi kuin viesti, viesti murtuu helposti, koska samat substituutiot toistuvat säännönmukaisesti.

Vaikka tämä salain yleisesti tunnetaan Vigenère-salauksena, sen kehitti itse asiassa jo aiemmin Giovan Battista Bellaso. Blaise de Vigenère sen sijaan kehitti huomattavasti vahvemman salaimen, ns. autokey-salaimen, jossa avain muodostetaan avaimen salaisesta osasta (yllä ”OLI”) ja loppu viestistä itsestään (”TÄYSI”) eli avaimeksi tulisi ”OLITÄ”. Tämä salaus välttää avaimen toistumisesta johtuvan jaksollisuuden.


Autokey-esimerkki:

selväviesti

T

Ä

Y

S

I

avain

O

L

I

T

Ä


Vigenère-salaimen koodiesimerkit

Salataan ensin jo aiemmin näyttämämme viesti ”TÄYSI” avaimella ”OLI” ja puretaan se tämän jälkeen.

Inactive
from xip import vigenere, merkistot, esikasittele_teksti
isot, pienet = merkistot(suomi=True)

viesti='Täysi'
esikäsitelty_viesti = esikasittele_teksti(viesti, isot+pienet)

print("Alkuperäinen viesti    :", viesti)
print("Esikäsitelty viesti    :", esikäsitelty_viesti)


# Asetetaan avain = 'OLI' – jos avainta ei anneta funktio käyttää oletusarvonta avaimen arvoa 3.
avain='OLI'
# Asetetaan aakkosto = isot – jos aakkostoa ei anneta, oletetaan suomenkielen aakkoset.
# Asetetaan purku-lippu = False, joka kertoo, että olemme salaamassa, emme purkamassa viestiä.

# Suoritetaan Vigenère-salaus edellisillä arvoilla.
salateksti=vigenere(esikäsitelty_viesti,aakkosto=isot, avain=avain, purku=False)
print("Vigenere salateksti on :", salateksti)

# Suoritetaan salauksen purku asettamalla purkulippu arvoon True.
dekoodattu_teksti=vigenere(salateksti,aakkosto=isot, avain=avain, purku=True)
print("Vigenere dekoodattu on :", dekoodattu_teksti)

# Avain on aina salaisuus, mutta nyt näytämme sen.
print("Avain on               :", avain)

Kokeillaan Vigenère-salainta kun viesti on Kahvi Charlotassa on hyvää ja vahvaa ja avaimena ”SAULI”. Alla oleva koodi auttaa tehtävän tekemisessä. Voit myös tehdä tehtävän kynällä ja paperilla.

Mikä on syntyvä salakielinen viesti?

Voit valita useamman vaihtoehdon. Katso jälkimmäinen osan tulosteita, joissa viesti on edelleen Kahvi Charlotassa on hyvää ja vahvaa mutta avain on ”AAAAA”. Mitä tapahtui?

Inactive
from xip import vigenere, merkistot, esikasittele_teksti
isot, pienet = merkistot(suomi=True)

viesti='Kahvi Charlotassa on hyvää ja vahvaa'
esikäsitelty_viesti = esikasittele_teksti(viesti, isot+pienet)

print("Alkuperäinen viesti    :", viesti)
print("Esikäsitelty viesti    :", esikäsitelty_viesti)

avain='SAULI'

# Suoritetaan viestin salaus
salateksti=vigenere(esikäsitelty_viesti,aakkosto=isot, avain=avain, purku=False)
print("Vigenere salateksti on :", salateksti)

# Suoritetaan salauksen purku
dekoodattu_teksti=vigenere(salateksti,aakkosto=isot, avain=avain, purku=True)
print("Vigenere dekoodattu on :", dekoodattu_teksti)

# Avain on aina salaisuus, mutta nyt näytämme sen.
print("Avain on               :", avain)

# Vaihdetaan avain AAAAA
print("Vaihdetaan avaimeksi AAAAA")
avain='AAAAA'

# Avain on aina salaisuus, mutta nyt näytämme sen.
print(f"Avaimella {avain}")

# Suoritetaan viestin salaus
salateksti=vigenere(esikäsitelty_viesti,aakkosto=isot, avain=avain, purku=False)
print("Vigenere salateksti on :", salateksti)

# Suoritetaan salauksen purku
dekoodattu_teksti=vigenere(salateksti,aakkosto=isot, avain=avain, purku=True)
print("Vigenere dekoodattu on :", dekoodattu_teksti)

Seuraava tehtävä on vastaavanlainen, mutta nyt sinun on osattava käyttää salainta itse Python-koodilla.

Alice lähettää Bobille viestin Vigenère-salattuna. He käyttivät aiemmin Caesar-salauksessa avainta 3 sekä Vigenère-avainta ”OLI”. Carol oli kuitenkin yllättäen kysynyt Bobilta, ovatko he Alicen kanssa suunnitelleet hänelle syntymäpäiväjuhlia. Alice ja Bob päättävät vaihtaa käyttämänsä Vigenère-avaimen. Tehtävänäsi on selvittää, mikä uusi avain on ja mitä seuraavassa salateksti viestissä sanotaan. Viesti kuuluu: JAÖWSTGSRÄJUHRUIRAVÖPSBILHOWÅAYMÅTJPHNVQTMPPFNPTSEADUTBGYETTSEXIUSTSRAVIRUY .

viesti="JAÖWSTGSRÄJUHRUIRAVÖPSBILHOWÅAYMÅTJPHNVQTMPPFNPTSEADUTBGYETTSEXIUSTSRAVIRUY"

Avain on:

Onko viestin kakku:

Inactive
from xip import vigenere, merkistot, esikasittele_teksti
isot, pienet = merkistot(suomi=True)

# Muuta seuraavaan riviin tehtävän salateksti
salateksti='TÄHÄNSALATEKSTI'
print(f"Alkuperäinen viesti    : {salateksti}")

# Seuraavaan muuttujaan tarvitsee kokeilla tehtävän eri avaimia
avain='ASETATÄHÄNAVAIN'
dekoodattu_teksti=vigenere(salateksti,aakkosto=isot, avain=avain, purku=True)
print(f"Vigenere dekoodattu on : {dekoodattu_teksti}")

Yhteenveto

Nyt tunnemme ja osaamme käyttää kolmea historiallista substituutiosalainta. Ymmärrämme, miten selvätekstistä muodostuu salaimella salateksti. Ymmärrämme myös sen, että avaimella on suuri merkitys salauksen onnistumisessa.

Seuraavaksi opiskelemme kertakäyttöavaimen salat.

Palautusta lähetetään...