www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

blizz

Gepostet:
17.06.2006 22:48

Steganographie  
Ich hoffe ihr könnt mir helfen!
Bin zur Zeit am Renovieren und umziehen und hab mir die Haskell aufgebe noch gar nicht angeschaut, muss aber am Montag die Aufgebe abgeben!
Ich hoffe ihr bekommt das hin! Vielen Dank kim vorraus
Blizz

Hier die Aufgabe

Eine sehr elegante Methode Geheimnisse zu übertragen ist die Steganographie. Hier wird das Geheimnis nicht verschlüsselt übertragen, sondern verborgen in einer harmlos aussehenden Nachricht mitgeschickt, so dass ein unwissender Beobachter nichts davon mitbekommt. Ein derartiges Verfahren dürfen Sie nun implementieren.

a) Zunächst sollte eine Mitteilung in das Binärformat gewandelt werden. Definieren Sie dazu den DatentypBit und implementieren Sie Instanzen für die Klassen Read,Show,Eq,Ord,Num.

b) Wandeln Sie nun Zeichen aus dem Ascii-Alphabet in eine Liste von Bits (für jedes Zeichen genau acht Bit). Die Funktion soll toBin8 heißen.

c) Um eine Mitteilung in einem Text zu verstecken, verwenden Sie eine Liste von Tupeln, die alternative Schreibweisen enthält. Zum Beispiel:

[("daß","dass"),("Paare","2−Tupel"),("Normalform","NF"),
("schlimmsten","schlechtesten"), ("Da","Weil"),("zeitgleich","simultan"),
("welche","die"), ("erlaubt","gestattet"),("korrigieren","verbessern"),
("gleiche","selbe"), ("solches","derartiges"),("wandeln","konvertieren"),
("falls","wenn"),("nun","jetzt"), ("verkünden","proklamieren"),
("eigens","extra"),("Methode","Möglichkeit"), ("hier","dabei"),
("benutzen","verwenden"),("erweitern","ergänzen"),("auch","sogar"),
("absolut","vollständig"),("äuÿerst","extrem"),("braucht","benötigt"),
("mit","mittels"), ("einigermaÿen","relativ"),("etwas","recht"),
("zeigen","beweisen"),("Fehler","Irrtum"), ("gleich","identisch"),
("versteckt","verborgen"),("sollen","dürfen"),("Nachricht","Mitteilung"),
("soll","sollte")]

Wird die erste Alternative genommen, bedeutet dies eine Null, die zweite eine Eins in der Binärdarstellung.
Implementieren Sie eine Funktion hideMessage, die in einem Text eine Nachricht versteckt, falls genug passende
Paare im Text gefunden werden.

d) Nun fehlt noch die Rekonstruktion der Nachricht. Implementieren Sie eine Funktion findMessage, die in einem
Text die versteckten Bits findet und die Nachricht rekonstruiert.
Zum Seitenanfang    
 
Jacke

Gepostet:
18.06.2006 11:14

   
so hier erstmal etwas...ich mache jetzt erstmal ne stunde pause :-)

data Bit = Null| Eins deriving (Read,Show,Eq,Ord,Enum)
type Bits =[Bit]


toBin c=umwandeln( laenge8 (toBinary(fromEnum c)))

toBin8 []=[]
toBin8 (c:cs) =(toBin c)++(toBin8 cs)

umwandeln [] = []
umwandeln (x:xs)
|(x==1) =Eins : (umwandeln xs)
| otherwise = Null : (umwandeln xs)

toBinary 0 = [0]
toBinary x = toBinary t ++ [x `mod` 2]
where t = x `div` 2

laenge8 (l:liste)
|(length (l:liste) < 8) = laenge8 (0:(l:liste))
|(length (l:liste) > 8)= laenge8 liste
|otherwise = (l:liste)

hideMessage text= hideMessagehelp (splittetext text [])
hideMessagehelp []=[]
hideMessagehelp (x:xs)
| ((findword x tupel)== []) = (toBin8 x): (hideMessagehelp xs)
| otherwise = (findword x tupel): (hideMessagehelp xs)

findword x []=[]
findword x ((a,b):liste)
|(x==a) = [Eins]++ (toBin8 b)
|(x==b) = [Null]++ (toBin8 a)
|otherwise=findword x liste

splittetext [] acc =acc:[]
splittetext (x:xs) acc
|(x==' ') = acc:(splittetext xs [])
|otherwise = splittetext xs (acc++[x])

tupel=[("daß","dass"),("Paare","2-Tupel"),("Normalform","NF"),("schlimmsten","schlechtesten"),("Da","Weil"),("zeitgleich","simultan"),("welche","die"),("

erlaubt","gestattet"),("korrigieren","verbessern"),("gleiche","selbe"),("solches","derartiges"),("wandeln","konvertieren"),("falls","wenn"),("nun","jetzt

"),("verkünden","proklamieren"),("eigens","extra"),("Methode","Möglichkeit"),("hier","dabei"),("benutzen","verwenden"),("erweitern","ergänzen"),("auch","

sogar"),("absolut","vollständig"),("äußerst","extrem"),("braucht","benötigt"),("mit","mittels"),("einigermaßen","relativ"),("etwas","recht"),("zeigen","b

eweisen"),("Fehler","Irrtum"),("gleich","identisch"),("versteckt","verborgen"),("sollen","dürfen"),("Nachricht","Mitteilung"),("soll","sollte")]
Zum Seitenanfang    
 
Jacke

Gepostet:
18.06.2006 15:21

   
so da ist sie die decode funktion*schweiß von der stirn wisch*

txt ="daß Fehler äußerst oft in Nachrichten versteckt sind weiß man doch"
test=hideMessage "da"
test2= hideMessage txt
--------------------------------------------------


findMessage []=[]
findMessage (x:xs)
|(((length x)`mod` 8) ==0)= (fromBin x):(findMessage xs)
|otherwise=erstesbit x
where
erstesbit (c:cs)
|(vergleich c Eins)=(findword2 (fromBin cs) tupel ): (findMessage xs)
|otherwise =(findword2 (fromBin cs) tupel ) : (findMessage xs)




findword2 x []=[]
findword2 x ((a,b):liste)
|(x==a) = b
|(x==b) = a
|otherwise=findword2 x liste



toint [] = 0
toint (x:xs)
|(x==1) =( 2^( length (xs) ) ) +(toint xs)
| otherwise = 0+ (toint xs)



frombin []=[]
fromBin (c)
|((length c)<=8)=[( toEnum(toint(umwandeln2 (take 8 c)))::Char )]
|otherwise =[( toEnum(toint(umwandeln2 (take 8 c)))::Char )] ++fromBin(drop 8 c)



umwandeln2 [] = []
umwandeln2 (x:xs)=if (vergleich x Eins) then (1 : (umwandeln2 xs)) else (0:(umwandeln2 xs))


Smiliefertig :-)

du mußt zu test zwecken den text den du kodieren willst immer in der datei eingeben (siehe meine funktion txt) ansonsten hat haskell probleme mit den ß und dem ä ü usw.
(er kann sie ja nichtmal korrekt ausgeben) die funktionen machen aber alles richtig

testen kannst du die decode und die codierungsfunktion mit
hideMessage txt

und
findMessage test2


gruß jacke
Zum Seitenanfang    
 
blizz

Gepostet:
18.06.2006 17:58

   
danke! ich glaube ohne euch wäre ich aufgeschmissen!


aber GHCI bringt einen Fehler bzw zwei fehler:
Not in scope: 'vergleich'

und zwar bei:

|(vergleich c Eins)=(findword2 (fromBin cs) tupel ): (findMessage xs)

und

umwandeln2 (x:xs)=if (vergleich x Eins) then (1 : (umwandeln2 xs)) else (0:(umwandeln2 xs))


blizz
Zum Seitenanfang    
 
Jacke

Gepostet:
18.06.2006 18:04

   
hab vergessen eine funktion zu kopieren ^^ ...sorry die fehlt dir natürlich noch

vergleich::Bit->Bit ->Bool
vergleich Eins Eins=True
vergleich Null Null=True
vergleich _ _ =False

Smilie

gehts jetzt?
Zum Seitenanfang    
 
blizz

Gepostet:
20.06.2006 16:07

   
jau, geht!

aber ich steig noch nicht ganz hinter das programm
kannst du mir mal zeile für zeile erklären wie das programm funktioniert?
danke!
Zum Seitenanfang    
 
Jacke

Gepostet:
20.06.2006 18:00

   
na klar


--also hier wird der datentyp bit definiert
data Bit = Null| Eins deriving (Read,Show,Eq,Ord,Enum)
type Bits =[Bit]
--type Bits brauch man garnicht...

--toBin wandelt einen einzigen Buchstaben in ein Bit mit 8 zahlen um z.b. [Null,Eins,...,Null]
toBin c=umwandeln( laenge8 (toBinary(fromEnum c)))

--wandelt ein wort um
toBin8 []=[]
toBin8 (c:cs) =(toBin c)++(toBin8 cs)

--macht aus einer normalen liste von binärzahlen den eigenen datentyp
--"1" ein "Eins", und aus "0" Null
umwandeln [] = []
umwandeln (x:xs)
|(x==1) =Eins : (umwandeln xs)
| otherwise = Null : (umwandeln xs)
--macht aus einen Int ne Binärzahl z.b. aus 5 [1,0,1]
toBinary 0 = [0]
toBinary x = toBinary t ++ [x `mod` 2]
where t = x `div` 2
---sorgt dafür das jeder buchstabe aus wirklich 8 bit besteht...also es werden wenn es 9 bits sind
--die ersten gelöscht und wenns weniger als 8 sind vorne Nullen davor geschrieben
laenge8 (l:liste)
|(length (l:liste) < 8) = laenge8 (0:(l:liste))
|(length (l:liste) > 8)= laenge8 liste
|otherwise = (l:liste)
--verbirgt die nachricht
hideMessage text= hideMessagehelp (splittetext text [])
--hier wird zunächst mit findword geschaut ob das aktuelle wort zufällig ein wort aus der liste ist...
---wenn ja wird das andere wort aus dem tupel genommen und verschlüsselt...ansonsten wird jedes wort mit toBin8 binärcodiert
hideMessagehelp []=[]
hideMessagehelp (x:xs)
| ((findword x tupel)== []) = (toBin8 x): (hideMessagehelp xs)
| otherwise = (findword x tupel): (hideMessagehelp xs)
--sucht das wort aus der liste von tupelns raus
---wenn das wort nicht enthalten ist wird die leere liste zurrückgegeben...
---hier wird dann auch am anfang des wortes geschrieben welches wort aus den tupel genommen wurde
--NUll für den ersten teil des tupels eins für den zweiten
findword x []=[]
findword x ((a,b):liste)
|(x==a) = [Eins]++ (toBin8 b)
|(x==b) = [Null]++ (toBin8 a)
|otherwise=findword x liste

--zerlegt den text anhand der leerzeichen in eine liste von strings
splittetext [] acc =acc:[]
splittetext (x:xs) acc
|(x==' ') = acc:(splittetext xs [])
|otherwise = splittetext xs (acc++[x])

---die schlüsselwörter
tupel=[("daß","dass"),("Paare","2-Tupel"),("Normalform","NF"),("schlimmsten","schlechtesten"),("Da","Weil"),("zeitgleich","simultan"),("welche","die"),("

erlaubt","gestattet"),("korrigieren","verbessern"),("gleiche","selbe"),("solches","derartiges"),("wandeln","konvertieren"),("falls","wenn"),("nun","jetzt

"),("verkünden","proklamieren"),("eigens","extra"),("Methode","Möglichkeit"),("hier","dabei"),("benutzen","verwenden"),("erweitern","ergänzen"),("auch","

sogar"),("absolut","vollständig"),("äußerst","extrem"),("braucht","benötigt"),("mit","mittels"),("einigermaßen","relativ"),("etwas","recht"),("zeigen","b

eweisen"),("Fehler","Irrtum"),("gleich","identisch"),("versteckt","verborgen"),("sollen","dürfen"),("Nachricht","Mitteilung"),("soll","sollte")]
Zum Seitenanfang    
 
Jacke

Gepostet:
20.06.2006 18:12

   
so hier die decode funktion:


--beispiele zum testen
txt ="daß Fehler äußerst oft in Nachrichten versteckt sind weiß man doch"
test=hideMessage "da"
test2= hideMessage txt
--------------------------------------------------

--die hauptfunktion erhält eine liste von listen von Bit bsp[[String1],[String2],[String3]] die Strings sind natürlich
--als [Null,Eins,...,Null] codiert
--hier wird erstmal geschaut ob das liste [Null,Eins,...,Null] durch 8 teilbar ist...wenn das der fall ist
--dann wird das wort ganz normal wieder zurück gewandelt. falls es nicht durch 8 teilbar ist dann ist es ein wort aus
--der schlüsselwortliste...und das erstebit wird weggeworfen und der rest entschlüsselt und durch das wort aus der liste ersetzt
findMessage []=[]
findMessage (x:xs)
|(((length x)`mod` 8) ==0)= (fromBin x):(findMessage xs)
|otherwise=erstesbit x
where
erstesbit (c:cs)
|(vergleich c Eins)=(findword2 (fromBin cs) tupel ): (findMessage xs)
|otherwise =(findword2 (fromBin cs) tupel ) : (findMessage xs)



--sucht das wort aus der liste raus und gibt das jeweils andere aus dem tupel zurrück
findword2 x []=[]
findword2 x ((a,b):liste)
|(x==a) = b
|(x==b) = a
|otherwise=findword2 x liste


--wandelt eine liste von [1,0,1,0,..] in einen Int um
toint [] = 0
toint (x:xs)
|(x==1) =( 2^( length (xs) ) ) +(toint xs)
| otherwise = 0+ (toint xs)


---mit die wichtigste funktion...wenn die länge der liste [1,0,1,..] kleiner gleich 8 ist dann wird hier das richtige buchstabe wiederhergestellt
frombin []=[]
fromBin (c)
|((length c)<=8)=[( toEnum(toint(umwandeln2 (take 8 c)))::Char )]
|otherwise =[( toEnum(toint(umwandeln2 (take 8 c)))::Char )] ++fromBin(drop 8 c)


--macht aus [Null,Eins,Null...] wieder [0,1,0,...]
umwandeln2 [] = []
umwandeln2 (x:xs)=if (vergleich x Eins) then (1 : (umwandeln2 xs)) else (0:(umwandeln2 xs))

--vergleich ist zu vergleichen von Bit also Eins==Eins ;-)


so das wars kommentare sind im quellcode Smilie
Zum Seitenanfang