Tik-76.115 Tekninen määrittely
Stegano
http://
Viimeksi päivitetty .
Sisällysluettelo
1. Johdanto
2. Järjestelmän yleiskuvaus
3. Arkkitehtuurin kuvaus
4. Moduli (ja prosessi) -kuvaukset
Liite 1: The JPEG-format
Liite 2: The GIF-format
Tämä dokumentti
Luvussa 1 "Johdanto"
määritellään ohjelmiston käyttäjät, tavoitteet, määritelmät ja termit
sekä luetellaan lähteet.
Luvussa 2 "Järjestelmän yleiskuvaus"
kuvataan lyhyesti järjestelmän käyttöympäristö ja yleiset rajoitteet.
Luvussa 3 "Arkkitehtuurin kuvaus"
kuvataan ohjelmiston arkkitehtuuri ja ratkaisuperiaatteet.
Luvussa 4 "Moduli (ja prosessi)-kuvaukset"
kuvataan yksityiskohtaisesti modulien rajapinnat ja sisältö.
Liittessä 1 "the JPEG-format" ja
liitteessä 2 "the GIF-format"
kuvataan kuvaformaattien rakennetta ja niille sopivia kätkemisalgoritmeja.
Käyttäjät
Ohjelmisto on tarkoitettu kaikille niille tietokoneen käyttäjille,
joilla on jokin tarve lähettää lyhyitä sanomia kenenkään havaitsematta.
Ohjelmisto soveltuu myös tutkimustyöhön.
Tavoitteet
Ohjelmiston tavoitteena on tarjota siirrettävä ohjelmakirjasto, joka
tarjoaa turvallisen tavan kätkeä tietoa.
Lisäksi ohjelmakirjaston päälle rakennetaan unix- ja Windows
käyttöliitttymät, joiden avulla mahdollistetaan kirjaston helppo
käyttö ja joilla demonstroidaan kirjaston toimivuutta erilaisissa
käyttöjärjestelmäympäristöissä.
Ohjelmiston tarkoituksena on toimia kokeiluvälineenä tutkimustyössä
sekä osoittaa tiedon siirron täydellisen valvomisen olevan teknisesti
mahdotonta.
Määritelmät ja termit
- Kätkentäbitti (hiding bit)
Sellainen peitetiedoston kohinainen bitti, johon salainen viesti
kätketään. Kaikki kohinaiset bitit eivät ole välttämättä
kätkentäbittejä.
- Peitetiedosto (cover file)
Tiedosto, johon salainen viesti kätketään. Tiedoston täytyy
sisältää kohinaa, johon salainen viesti kätketään.
- Kätköviesti (stego message)
Peitetiedosto kätkennän jälkeen, eli viesti, joka kuljettaa
kätkettyä salaista viestiä.
Lähdeluettelo
- Bruce Schneier. Applied Cryptography. John Wiley & Sons, Inc. 1996.
- Tuomas Aura. Practical invisibility in digital communication, Workshop on Information Hiding, University of Cambridge, May 1995.
- Maxwell T. Sandford II, Jonathan N Bradley, and Theodore G. Handel. The data embedding method. In Proceeding of the SPIE Photonics East Conference, Philadelphia, September 1995.
- Michael Luby and Charles Rackoff. How to construct pseudorandom permutations from pseudorandom functions. SIAM Journal on Computing, 17(2):373-386, April 1988.
- Steffen Möller, Andreas Pfizmann, and Ingo Stierand. Rechnergstutzte Steganographie: Wie sie funktioniert und warum folglich jede Reglementierung von Verschlusselung unsinnig ist. Dateschultz und Datensicherung, (6):318-326, June 1994.
- gif89a.doc
- bmp.doc
- pbm.html
- jpeg
- Crypto++ 2.1
Sovellusalueen kuvaus
Steganograafisen systeemin ympäristö on kuvattu
kuvassa 1.
Lähettäjällä (sender) on jokin salainen viesti
(secret message), jonka hän haluaa lähettää vastaanoottajalle
(receiver) jotakin turvatonta kanavaa (insecure channel)
esimerkiksi internetiä pitkin.
Paitsi että lähettäjä ei tahdo kenenkään saavan tietää salaisen
viestin sisältöä (tämän takaamiseksi riittäisi pelkästään viestin
salaaminen jollain vahvoja kryptografisia algoritmejä käyttävällä
ohjelmalla, kuten PGP:llä), vaan hän tahtoo ettei kukaan edes tiedä
salaisen viestin olemassaolosta.
Viestien huomaamatonta lähetystä varten salainen
viesti kätketään johonkin viattomaan peitetiedostoon (cover file),
kuten esimerkiksi digitoituun kuvaan.
Kuva 1: Steganograafisen systeemin ympäristö
Tässä projektissa tehtävä ohjelmisto on itse tiedon kätkemisen
suorittava ohjelmisto. Ohjelmisto soveltaa valittavia algoritmejä
salaiseen viestiin ja peiteviestiin salaisen avaimen avulla tuottaen
tuloksena kätköviestin.
Ohjelmisto ilmenee kuvassa 1
laatikoina Hiding ja Extracting.
Käyttöympäristö
Projektin ensisijaisena tavoitteena on luoda siirrettävä ohjelmakirjasto, joka
tarjoaa turvallisen tavan kätkeä tietoa. Kirjaston tulee olla
mahdollisimman siirrettävä, eli käytön laitteistoympäristöstä riippumaton.
Ohjelmakirjaston päälle rakennetaan lisäksi käyttöliittymät UNIX- ja
Windows95 ympäristöihin.
Yleiset rajoitteet
- Ohjelmointikielenä käytetään C/C++:aa.
- Kryptografisten algoritmien toteutuksen osalta käytetään valmiita
luotettaviksi todettuja kryptografisia kirjastoja. Tämä siksi
että kryptografisten algoritmien ohjelmoinnista on helppo tehdä
pieniä virheitä, jotka huonontavat algoritmien turvallisuutta
dramaattisesti.
- Ohjelmakirjasto tulee suunnitella ja ohjelmoida mahdollisimman
laitteistoriippumattomaksi.
Ohjelmisto koostuu kolmesta päämodulista
(kuva 2):
Käyttöliittymän tehtävänä on vastaanottaa käyttäjän komennot ja
kutsua tarvittavia steganografisen kirjaston funktioita.
Steganografinen kirjasto suorittaa itse tiedon kätkemisen ja purkamisen.
Stegografinen kirjasto toteuttaa varsinaiset steganografiset funktiot,
kuten esimerkiksi tiedon kätkemiseen käytettävien bittien valinnan.
Näissä se käyttää apunaan kryptografisen kirjaston tarjoamia
kryptografisia perusfunktioita, kuten esimerkiksi IDEA-salausta.
Kuva 2: Ohjelmiston päämodulit
Kuvan 2 kolmen päämodulin välillä on
kaksi rajapintaa:
- Käyttöliittymän ja steganografisen kirjaston välinen rajapinta
- Steganografisen ja kryptografisen kirjaston välinen rajapinta
Käyttöliittymän ja steganografisen kirjaston välisen rajapinnan tulisi olla
sellainen että lisättäessä uusia peitetiedostoformaatteja tai
kätkentäalgoritmejä steganografiseen kirjastoon käyttöliittymää tarvitsisi
muuttaa mahdollisimman vähän.
Tässä työssä käytetään kryptografisena kirjastona Wei Dai:n
Crypto++ 2.1:aa.
Tällöin steganografisen ja kryptografisen kirjaston rajapinta on valmiiksi
määritelty eli Crypto++:n ulkoinen rajapinta tarvittavin osin.
Crypto++ on C++ kirjasto, joka tarjoaa kaikki tässä työssä tarvittavat
kryptografiset perusfunktiot sekä monia muita. Haittapuolena tästä valinnasta
on se että kirjaston käyttä rajoittaa muiden apukirjastojen kuten STL
käyttöä, koska Crypto++ määrittelee osan perustietorakenteista (kuten
vektorin) itse uudelleen.
4. Moduli (ja prosessi) -kuvaukset
4.1 Käyttöliittymät
Molempien käyttöliittymien (Unix ja Windows) pääasiallinen tehtävä on
välittää käyttäjän komennot ohjelmistolle ja ohjelmiston viestit
käyttäjälle. Yleisesti ottaen käyttöliittymä tulkkaa käyttäjän antamat
komennot ja kutsuu steganografisia kirjastofunktioita oikeilla
argumenteilla käyttäjän toiveiden mukaisesti. Ennen
kirjastofunktiokutsuja käyttöliittymä lisäksi tarkastaa onko käyttäjän
antamat argumentit yleensäkään lailliset. Lisäksi
käyttöliittymä tulkkaa kirjastofuntioiden antamat vasteet ja ilmoittaa
selvän ja kuvaavan ilmoituksen funktion tuloksesta.
Yksityiskohtainen kuvaus käyttöliittymän ja kirjastofunktioden
välisestä kommunikaatiosta on kuvattu luvussa
4.2.1 Rajapinta käyttöliittymään.
Kuva 3: Steganografinen kirjasto
Steganografinen kirjasto
kommunikoi käyttöliittymän kanssa vain luokan CoverPool
jäsenfunktion match
ja luokasta Cover perittyjen ei-abstraktien luokkien
julkisten jäsenfunktioiden kautta.
Luokan CoverPool tehtävänä on osaltaan mahdollistaa se,
ettei käyttöliittymää tarvitse välttämättä muuttaa lisättäessä
uusia peitetiedostotyyppejä. Luokka CoverPool sisältää
jäsenfunktion match, jota kutsuttaessa luokka käy läpi kaikki
ohjelmistoon implementoidut peitetiedostoformaatit yrittäen löytää
formaatin, joka on sama kuin kutsussa annetun tiedoston.
Tyypillinen käyttöliittymän ja steganografisen kirjaston välinen kommunikaatio
olisi:
- Käyttöliittymä kutsuu CoverPool-luokan funktiota
match käyttäjän antamalla tiedoston nimellä.
- CoverPool-luokka antaa uuden instanssin oikeantyyppiseen
Cover-luokasta perittyyn peitetiedostoluokkaan, esim.
PGMCover.
- Käyttöliittymä avaa tiedoston kutsumalla
PGMCover-luokan funktiota open.
- (Windows) käyttöliittymä kysyy PGMCover-luokalta, mitä
algoritmejä ja metodeja se voi soveltaa viestin kätkemisessä
ja näyttää nämä käyttäjälle.
Kysely tapahtuu kutsumalla PGMCover-luokan funktioita
compressionAlgorithms, encryptAlgorithms,
selectors.
- Käyttäjän valittua algoritmit ja annettua salanan ja viestin
käyttöliittymä kutsuu PGMCover-luokan funktiota
hide, joka kätkee viestin peitetiedostoon.
- Käyttöliittymä tallettaa tiedoston levylle komennolla save.
Kuvassa 4 on esimerkki
käyttöliittymärajapinnan tapahtumista kätkemisvaiheessa.
Kuva 4: Esimerkki käyttöliittymärajapinnan tapahtumista (*)
(*) Erilaiset sovellettavien metodien/algoritmien kyselyt (esim.
compressionAlgorithms) on esitetty yhdellä
kyselyllä get applicaple methods.
(Cover.cpp,
Cover.hh)
Julkiset jäsenfunktiot:
- konstruktori. Ei ota mitään argumentteja eikä tee mitään
ulospäin näkyvää.
- destruktori. Ei ota mitään argumentteja eikä tee mitään
ulospäin näkyvää.
- error Palauttaa viimeisimmän suoritetun jäsenfunktion virheen,
NoError jos virheetön suoritus.
- registerCoverFormat. Rekisteröi peitetiedostoformaatin, jolloin
se voidaan myöhemmin löytää match-jäsenfunktiossa.
Argumentit:
- Osoitin funktioon joka tutkii onko annetun tiedoston
formaatti peitetidoston mukainen ja palauttaa osoittimen
ko. peitetiedoston luokan (luokan Cover aliluokka)
uuteen instanssiin.
Palauttaa:
- 1 jos rekisteröinti onnistui.
- 0 jos rekisteröinti epäonnistui.
Virheet:
- match
Argumentit:
- Tutkittavan tiedoston nimi.
Palauttaa:
- Osoittimen sellaisen peitetiedoston luokan
(luokan Cover aliluokan) uuteen instanssiin,
jonka formaatti on sama kuin tutkittavan tiedoston.
- 0 jos ei löytynyt sellaista peitetiedostoluokkaa,
jolla olisi sama formaatti.
Virheet:
- Could not open file, jos tiedostoa ei voitu avata.
- Unknown cover file format, jos ei löytynyt
peitetiedostoluokkaa, jolla olisi sama formaatti.
4.2.3 Luokka Cover
(Cover.cpp,
Cover.hh)
(PGMCover.cpp,
PGMCover.hh)
(GIFCover.cpp,
GIFCover.hh)
(JPGCover.cpp,
JPGCover.hh)
Virheiden käsittely
Ne jäsenfunktiot jotka voivat palauttaa virheen, palauttavat paluuarvonaan
arvon 1 jos suoritus onnistui ja arvon 0 jos suoritus epäonnistui.
Epäonnistuneen kutsun jälkeen virheen tarkempi tyyppi voidaan
saada selville kutsumalla jäsenfunktiota error.
Huom. Virheissä ei ole erikseen mainittu sisäistä virhettä
Internal error.
- konstruktori. Ei ota mitään argumentteja eikä tee mitään
ulospäin näkyvää.
- destruktori. Ei ota mitään argumentteja eikä tee mitään
ulospäin näkyvää.
- error Palauttaa viimeisimmän suoritetun jäsenfunktion virheen,
NoError jos virheetön suoritus.
- open. Yrittää avata ja lukea tiedoston muistiin
käsittelyä varten.
Argumentit:
- Avattavan tiedoston nimi.
Palauttaa:
Virheet:
- Could not open file.
- Unknown cover file format.
- Corrupted file.
- Out of memory
- format. Tällä funktiolla saadaan tulostettavassa muodossa
peitetiedostonluokan formaatin nimi, esim. PGM.
Argumentit:
Palauttaa:
- Peitetiedostonluokan formaatti.
Virheet:
- selectors. Palauttaa listan niistä kätköbittien
valintametodeista, joita ko. peitetiedostyyppiin voidaan soveltaa.
Argumentit:
Palauttaa:
- Lista kätköbittien valintametodeista. Listan ensimmäinen
metodi on oletusarvoinen metodi.
Virheet:
- encryptAlgorithms. Palauttaa listan niistä salausmetodeista,
joita voidaan käyttää viestin salaamiseen (esim. DES, IDEA).
Tämä funktio ja compressionAlgorithms ovat osa
Cover-luokkaa, jotta rajapinta käyttöliittymään pysyisi
yksinkertaisena.
Argumentit:
Palauttaa:
- Lista salausmetodeista. Listan ensimmäinen
metodi on oletusarvoinen metodi.
Virheet:
- compressionAlgorithms. Palauttaa listan niistä
kompressiometodeista, joita voidaan käyttää viestin salaamiseen
(esim. GZIP, ei kompressiota).
Argumentit:
Palauttaa:
- Lista kompressiometodeista. Listan ensimmäinen
metodi on oletusarvoinen metodi.
Virheet:
- hide. Kätkee salaisen viestin peitetiedostoon.
Argumentit:
- Käyttäjän antama salainen viesti.
- Käyttäjän antama salasana.
- Haluttu salaisen viestin kompressiometodi.
Jos ei tahdota kompressiota, voidaan antaa arvo none.
- Haluttu salaisen viestin salausmetodi.
Voidaan antaa myös arvo default, jolloin
valitaan oletusarvoinen salausalgoritmi.
- Haluttu kätköbittien valintametodi.
Voidaan antaa myös arvo default, jolloin
valitaan oletusarvoinen valintametodi.
Palauttaa:
Virheet:
- No cover file open.
- Out of memory.
- Unsupported selector.
- Unsupported compression algorithm
- Unsupported encryption algorithm
- Message too long
Tarkempi toiminallinen kuvaus:
- Peitetiedoston pohjalta lasketaan avainmateriaali.
Tämä tapahtuu syöttämällä SHA-algoritmille
inputtina ensin käyttäjän antama salasana, sitten
peitetiedoston ei kohinaiset bitit ja lopuksi vielä
käyttäjän antama salasana uudelleen. SHA-algoritmin
ulostulo on avainmateriaali.
- Kätköbittien valinta-algoritmi alustetaan.
- Kutsutaan MessageHider-luokan instanssia,
joka suorittaa itse viestin esikäsittelyn ja kätkemisen
(käyttäen apunaan tämän luokan funktiota writeNextBit).
Huom! Jos kätkentä epäonnistuu, on peitetiedosto sen jälkeen tilassa,
jossa voi olla kätkettynä vain osa viestiä eli tiedosto on
siltä kannalta katsoen korruptoituneessa tilassa. Tallentamista
save:lla ei suositella.
- extract. Purkaa salaisen viestin peitetiedostosta.
Argumentit:
- Käyttäjän antama salainen viesti.
- Käyttäjän antama salasana.
- Haluttu salaisen viestin salausmetodi.
Voidaan antaa myös arvo default, jolloin
valitaan oletusarvoinen salausalgoritmi.
- Haluttu kätköbittien valintametodi.
Voidaan antaa myös arvo default, jolloin
valitaan oletusarvoinen valintametodi.
Palauttaa:
- Peitetiedostoon kätketty salainen viesti.
Virheet:
- No cover file open.
- Out of memory.
- Unsupported selector.
- Unsupported compression algorithm.
- Unsupported encryption algorithm.
- No message hidden.
- Corrupted message.
Tarkempi toiminallinen kuvaus:
- Peitetiedoston pohjalta lasketaan avainmateriaali.
Tämä tapahtuu syöttämällä SHA-algoritmille
inputtina ensin käyttäjän antama salasana, sitten
peitetiedoston ei kohinaiset bitit ja lopuksi vielä
käyttäjän antama salasana uudelleen. SHA-algoritmin
ulostulo on avainmateriaali.
- Kätköbittien valinta-algoritmi alustetaan.
- Kutsutaan MessageExtractorr-luokan instanssia,
joka suorittaa itse viestin purkamisen
(käyttäen apunaan tämän luokan funktiota readNextBit.
- save. Tallettaa peitetiedoston levylle.
Argumentit:
- Talletettavan tiedoston nimi.
Palauttaa:
Virheet:
- No cover file open.
- Could not open file.
- close. Sulkee peitetiedoston.
Argumentit:
Palauttaa:
Virheet:
Nämä funktiot on tarkoitettu kirjoittamaan ja lukemaan peitetiedostosta
kätkettyjä bittejä. Näitä kutsutaan luokista MessageHider ja
MessageExtractor.
- readNextBit. Lukee yhden bitin peitetiedostosta
käyttäen valittua kätköbittien valinta-algoritmia.
Argumentit:
Palauttaa:
Virheet:
- Message too long.
- No cover file open.
- writeNextBit. Kirjoittaa yhden bitin peitetiedostoon
käyttäen valittua kätköbittien valinta-algoritmia.
Argumentit:
Palauttaa:
Virheet:
- Message too long.
- No cover file open.
Lisäksi jokaisen peitetiedostoluokan tulee toteuttaa yksi staattinen
funktio, joka tutkii onko annettu tiedosto sen formaatissa.
- isFormat. Tutkii onko annettu tiedosto samaa formaattia
kuin peitetiedostoluokka.
Argumentit:
Palauttaa:
- Osoittimen sellaisen luokan uuteen instanssiin,
jos tutkittavan tiedoston formaatti on sama.
- 0 jos formaatti ei ollut sama.
Virheet:
4.2.4 MessageHandler
(MessageHandler.cpp,
MessageHandler.hh)
Tämän ja tästä johdettujen luokkien MessageHider ja
MessageExtractor tehtävänä on eristää viestiin kohdistuvat
toimenpiteet (pakkaus, salaus ja otsikon lisäys) omiksi luokiksi,
jottei jokaisen Cover-luokasta johdetun peitetiedostoluokan
tarvitsisi implementoida niitä erikseen.
- error. Palauttaa viimeisimmän virheen.
Argumentit:
Palauttaa:
- Viimeinen tapahtunut virhe.
Virheet:
- encryptAlgorithms. Palauttaa listan niistä salausmetodeista,
joita voidaan käyttää viestin salaamiseen (esim. DES, IDEA).
Argumentit:
Palauttaa:
- Lista salausmetodeista. Listan ensimmäinen
metodi on oletusarvoinen metodi.
Virheet:
- compressionAlgorithms. Palauttaa listan niistä
kompressiometodeista, joita voidaan käyttää viestin salaamiseen
(esim. GZIP, ei kompressiota).
Argumentit:
Palauttaa:
- Lista kompressiometodeista. Listan ensimmäinen
metodi on oletusarvoinen metodi.
Virheet:
(MessageHider.cpp,
MessageHider.hh)
Kantaluokan MessageHandler funktioiden lisäksi:
- hide.
Argumentit:
- Peitetiedostoluokan instanssi, johon kätkeminen tapahtuu
(sen writeNextBit-funktion avulla).
- Kätkettävä viesti.
- Pakkausalgoritmi.
- Salausalgoritmi.
- Avainmateriaali.
Palauttaa:
Virheet:
- Could not write message into cover.
- Out of memory.
- Unsupported compression algorithm.
- Unsupported encryption algorithm.
- Unsufficient key material.
Esimerkki siitä kuinka
luokkaa MessageHider käytetään kätkentävaiheessa.
(MessageExtractor.cpp,
MessageExtractor.hh)
Kantaluokan MessageHandler funktioiden lisäksi:
- extract.
Argumentit:
- Peitetiedostoluokan instanssi, johon kätkeminen tapahtuu
(sen readNextBit-funktion avulla).
- Salausalgoritmi.
- Avainmateriaali.
Palauttaa:
- Peitetiedostoon kätketty viesti.
Virheet:
- Corrupted message.
- No message hidden.
- Out of memory.
- Unsufficient key material.
- Unsupported compression algorithm.
- Unsupported encryption algorithm.
4.2.7 Kätköbittien valinta-algoritmit
(Hiding bit selectors)
Näitä luokkia ei ole vielä tässä vaiheessa määritelty tarkkaan, koska
erilaisilla algoritmeillä voi olla joitain omia vaatimuksiaan rajapintojen
suhteen. Oletettavasti nämä kuitenkin ovat melko samanlaisia pseudosatunnaiseen
permutaatioon pohjautuvan algoritmin rajapinnan kanssa.
Pseudosatunnaiseen permutaatioon pohjautuva kätköbittien valinta-algoritmi
SelectPRP:
- konstruktori. Alustaa luokan, ei tee mitään ulospäin näkyvää.
- init. Alustaa algoritmin kuvan dimensioilla. Asettaa lukupään
bitin 0 kohdalle.
Argumentit:
- Kuvan leveys ja korkeus.
- Avain.
Palauttaa:
Virheet:
- nextBit. Palauttaa nykyisen kätköbitin koordinaatit ja
siirtää lukupäätä seuraavaan bittiin.
Argumentit:
Palauttaa:
- 1 ja kätköbitin koordinaatit jos onnistunut kutsu.
- 0 jos kaikki kätköbitit oli jo käyty läpi.
Virheet:
4.3 Kryptografinen kirjastomoduli
Kryptografinen kirjasto antaa steganografiselle kirjastolle useita
työkaluja monimutkaisia algoritmeja vaativiin tehtäviin. Esimerkiksi
peitetiedostoluokat (esim.
PGMCover.cpp/
.hh) käyttävät
kryptografista kirjastoa avainmateriaalin tuottamiseen kun taas
MessageExtractor/
MessageHider käyttävät sitä viestin
pakkaukseen/salaukseen.
Koska kryptografisen ja steganografisen kirjaston rajapinta on
suoraan
Crypto++ 2.1:n
ulkoinen rajapinta tarvittavin osin ei sitä ole tässä erikseen
määritelty.