Jonosalain

Näimme aikaisemmassa opetusmoduulissa, että historiallisissa salaimissa tiedon salaus tapahtui yksi kirjainmerkki kerrallaan avaimen ohjaamalla substituutiolla. Kirjainmerkki koostui esimerkeissämme kahdeksasta tai seitsemästä bitistä.

Jonosalain suorittaa kryptografista operaatiota yksi bitti kerrallaan. Voimme kuvitella, että joskus aikoinaan tietoa siirtyi yksi bitti kerrallaan, ja tuo yksi bitti salattiin jonosalaimen bitillä.

Katsotaan koodiesimerkin avulla kuinka jonosalain toimii. Oikean bittijonon sijasta kuvastamme bittijonoa ASCII-merkeistä ”0” ja ”1” koostuvalla ASCII-”bittijonolla”.

  • Olkoon salattava selväteksti bittikuvio 0b01101110, jota kuvastaa ASCII-merkkjono ”01101110”.

  • Olkoon avain 0b01011010, jota kuvastaa ASCII-merkkijono ”01011010”.

  • Jonosalain ottaa bittijonosta yhden bitin kerrallaan ”oikeanpuoleisesta” reunasta eli LSB-päästä suorittaessaan salausta.

Inactive
# Luodaan bittikuviot ASCII-merkeillä nolla "0" ja yksi "1"

p = "01101110" # p = plaintext eli selväkielinen bittikuvio
k = "01011010" # k = key eli avain

# Luodaan salatekstille paikka muuttujaan c
c = ""

print("Bitin järjestysnumero:"," ".join([str(i) for i in reversed(range(len(p)))]))
print("Selvätekstin bitit   :"," ".join(p))
print("Avaimen bitit        :"," ".join(k))

print("Suoritetaan jonosalaus suorittamalla XOR bittien välillä!")

# Seuraava FOR-silmukka toteuttaa jonosalauksen käyttämällä suoraan avaimen bittejä
# salauksen kohteeseen. Käsitellään ASCII-"bitit" lopusta alkuun (eli indeksit juoksevat nollasta seiskaan)
# ja toteutetaan XOR-funktio if-lauseella.

for i in range(len(p)):

    # Otetaan kierroksen muuttujiin i's ASCII-bitti selväkielestä ja avaimesta
    # oikeasta reunasta (LSB) alkaen
    p_i = p[len(p)-1-i]
    k_i = k[len(k)-1-i]

    # "Lasketaan" XOR-funktio ASCII-merkeillä, eli jos ASCII-merkit ovat yhtä suuret palautetaan ASCII-merkki "0", muutoin palautetaan "1"
    c_i = "0" if p_i==k_i else "1"

    # TUlostetaan mitä tehtiin
    print("bitin järjestys nro:", i)
    print("p:n bitti on       :", p_i)
    print("k:n bitti on       :", k_i)
    print("c:n tulos on       :", c_i)

    # Lisätään salattu bitti salatekstiin.
    c = c_i + c

print("\nSelväkielinen bittijono p, salattuna jonosalaimella käyttäen avainta k ja salausfunktiolla XOR tuottaa salatekstin c")
print("p:",p)
print("k:",k)
print("c:",c)

Jonosalaimen elementit

Edellisessä koodiesimerkissä toteutimme prototyypin jonosalaimesta (engl. stream cipher ). Vaikka luotu salain ei tietenkään sovellu oikeaan käyttöön tiedon salauksessa ja suojauksessa, se auttaa hahmottamaan jonosalaimen toimintaperiaatetta.

Oikea jonosalain tuottaa avaimesta sekä kertakäyttöluvusta avainjonoa. Avainjonon bitti tai bittikuvio toimii kulloisellakin ajanhetkellä enkoodauksen TAI dekoodauksen efektiivisenä avaimena. Tuota avainjonoa yhdessä XOR-funktion kanssa, kun selväteksti muunnetaan salatekstiksi ja kun salateksti muunnetaan selvätekstiksi. Aiemmin näytetty koodiesimerkki on siis yksinkertaistus. Siinä käytimme avainta avainjonona, mutta jonosalain käyttää itsessään avainta tuottaessaan avainjonoa.

Katsotaan lohkokaaviona miltä näyttää enkoodava jonosalain.

../_images/l4_jonosalain.png

Jonosalaimessa on tuttuja elementtejä muista salaimista:

  • K = avain, joka on tuotettu hyvällä kryptografisella satunnaislukugeneraattorilla.

  • P = selväkieli, esimerkiksi viesti tai bittikuvio, jonka salain muuttaa salakieleksi.

  • C = salakieli eli salaimen tuottama salakielinen viesti tai bittikuvio.

  • \(\boldsymbol\oplus\) = biteittäin suoritettava XOR-operaatio, jollainen esiteltiin edellisessä koodiesimerkissa.

Kun jonosalainta käytetään dekoodauksessa, vaihtavat \(P\) ja \(C\) paikkaa. Kaikki toimii muuten samoin.

Jonosalaimen uusia elementtejä ovat:

  • N = kertakäyttöluku (engl. NONCE, number used only once) eli luku jota käytetään vain yhden kerran. Jokaista yhteyskertaa tai viestiä varten tuotetaan uusi luku. Kertakäyttölukua hyödyntää myös lohkosalaimissa, jotka esitellään tämän moduulin seuraavassa osiossa. Siinä missä avaimen generointi vaatii hyvän kryptografisen satunnaislukugeneraattorin, kertakäyttöluvun voi tuottaa tavallisilla, ei-kryptografisilla satunnaislukugeneraattoreilla.

  • IV = alkuarvo (engl. Initial Value) on salauksen ensimmäisellä kierroksella käytettävä kertakäyttöluku N. Siinä missä avain vaihdetaan harvoin, alkuarvo vaihtuu jokaisen salauskerran alussa. Yhtä alkuarvoa saa käyttää vain kerran.

  • SC = jonosalain (engl. stream cipher): tuottaa avainjonoa (KS) avaimen (K) ja kertakäyttönumeron (N) avulla. Jonosalaimien kehittäminen on oma tieteenalansa. Emme tällä kurssilla tutustu näihin tätä osiota syvällisemmin.

  • KS = avainjono (engl. key stream) eli efektiivinen avain, jonka on muistutettava satunnaista tasajakautunutta bittigeneraattoria. Avainjonon bittejä käytetään XOR-operaattorilla käsiteltävään dataan.

Avainjonon tuottaminen on matemaattinen operaatio ja merkitään seuraavasti: \(\text{KS}= \text{SC}(K,N)\).

  • Enkoodaus tuottaa salatekstin: \(C_1= P_1\oplus\text{KS}\).

  • Dekoodaus tuottaa selvätekstin: \(P_1= C_1\oplus\text{KS}\).

Vastaa seuraaviin kysymyksiin edeltävän tekstin ja koodisolun pohjalta.

Valitse alta kaikki vaihtoehdot, jotka ovat totta.

Alla on kolme väittämää. Valitse niistä kaikki vaihtoehdot, jotka ovat totta. Voit selvittää oikean vastauksen muuttamalla aiempaa koodia tai laskemalla tuloksen kynällä ja paperilla.

Näihin väittämiin voit joutua päättelemään vastaukset, koska niihin ei ole suoraa vastausta tekstissä.


Jonosalainten historia

Tietokoneiden prosessoreiden laskentateho on ollut vielä 2000-luvun alussa hyvin rajoitettu. Tuolloin myös siirrettävät datamäärät olivat suhteellisen pieniä verrattuna tähän päivään. Data myös siirtyi silloisessa internetissä huomattavasti hitaammin kuin nykyään.

Kryptografisten operaatioiden laskeminen on ollut tavalliselle mikroprosessorille raskas tehtävä siitä huolimatta, että datanopeudet olivat nykyisellä mittapuulla melko vaatimattomia. Kryptografisia operaatioita toteutettiin erillisillä prosessoreilla tai prosessorin lohkoilla, jotka suorittivat tiedon suojauksen ja salauksen laskennat jonosalaimilla.

Klassinen jonosalain käsittelee bittijonoa, jossa avainjono muodostuu joko lineaarisesta tai epälineaarisesta rengasoskillaattorista. Emme tällä kurssilla perehdy kuinka avainketjuja tuotetaan. Myöhemmin kuitenkin näytämme, miten seuraavassa osiossa esitettäviin lohkosalaimiin on mahdollista sisällyttää jonosalaimen toiminnallisuutta jäljitteleviä ominaisuuksia.


Jonosalaimen taipumattomuus

Miksi tarvitsemme avainjonon KS jos meillä on kuitenkin olemassa salainen avain K? Ensimmäisellä luentokerralla kuvailimme kaksi kryptografian turvatavoitetta: erottamattomuus ( IND ) ja taipumattomuus ( NM ). Taipumattomuus tarkoittaa sitä, että jos muutamme joko salattavaa tietoa tai avainta, niin muutos ei saa näkyä salatekstissä merkityksellisellä tavalla. Voit joko muokata aikaisempaa, ASCII-merkkejä salaavaa koodia tai selvittää tehtävän muutoin.

Päättele tai käytä edellistä koodia vastataksesi seuraaviin kysymyksiin.

Valitse kaikki oikeat vaihtoehdot.

Mikä seuraavista väitteistä on totta? Valitse oikea vaihtoehto edellisen tehtävän ja aikaisemmin opitun pohjalta.

Avainketjun tai sitä vastaavan toiminnallisuuden toteuttaminen on nähtävissä useissa tulevissa salaimissa.


Yhteenveto

Tässä osiossa olemme oppineet jonosalaimesta seuraavat asiat:

  • Jonosalain käyttää avainta K.

  • Jonosalain vaatii hyvin toimiakseen kertakäyttöisen luvun NONCE.

  • Salaimen alustuksessa käytetyn NONCE:n vakiintunut nimi on IV.

  • Jonosalain hyödyntää salauksessa tuottamaansa avainketjua KC.

  • Avainketjun on oltava bittivirtaa, jossa pitkällä aikavälillä ykkösen ja nollan todennäköisyydet ovat ~50%, eli ne ovat tasajakautuneita.

  • Avainketjun bittejä käytetään salatessa selväkieli XOR-operaatiolla.

  • Enkoodaus ja dekoodaus käyttävät samaa salaimen rakennetta.

Seuraavassa osiossa katsomme, millainen on lohkosalain.

Palautusta lähetetään...