Die Aufgabe des Projektes hieß "Steganographie von WAV-Dateien", damit war gemeint, daß man eine geheime Nachricht mit beliebigem Inhalt in einer WAV-Datei versteckt. Die Lösung sollte in C implementiert werden.
Chunk: Datenblock variabler Länge
| RIFF-Header einer WAV-Datei | ||
|---|---|---|
| Offset | Bytes | Bemerkung |
| 00H | 4 | Chunk-Name "RIFF" |
| 04H | 4 | CHUNK-Länge |
| 08H | 4 | RIFF-Typ "WAVE" |
| Header-Chunk einer WAV-Datei | ||
|---|---|---|
| Offset | Bytes | Bemerkung |
| 00H | 4 | Chunk-Name "FMT" |
| 04H | 4 | Chunk-Länge (10H) |
| 08H | 2 | Format Typ: |
| 0:Mono | ||
| 1:Stereo | ||
| 0AH | 2 | Kanalzahl |
| 0CH | 4 | Samplerate in Hertz |
| 10H | 4 | Byte pro Sekunde |
| 14H | 2 | Bytes pro Sample |
| 1:8 Bit Mono | ||
| 2:8 Bit Stereo oder 16 Bit Mono | ||
| 4:16 Bit Stereo | ||
| 16H | 2 | Bits per Sample |
| FMT-Chunk einer WAV-Datei | ||
|---|---|---|
| Offset | Bytes | Bemerkung |
| 00H | 4 | Chunk Name "data" |
| 04H | 4 | Chunk-Länge |
| 08H | N | Datenbereich |
Der Quellcode als ARJ-File
Vor dem eigentlichen Programmieren waren folgende Betrachtungen zu machen:
Der Programmaufruf erfolgt über Parameter. Das Programm hat den Namen "GBMSYS". Beim Aufruf unter DOS hat man verschiedene Möglichkeiten.
Es erscheint eine kleine Online-Hilfe
Chiffriermodus wird gestartet
Es werden drei Dateien abgefragt:
enthält die zu versteckende Datei
enthält die Datei, in der versteckt werden soll
ist die Datei, welche die komplette Datei, (Versteck und Geheim), enthält
Dechiffriermodus wird gestartet
Es werden zwei Dateien abgefragt:
ist die Datei, die die versteckte Datei enthält
ist die zu übermittelnde Datei
Bei den Überlegungen zu den Prüfalgorithmen waren folgende Fragen zu klären:
Es müssen WAV - Dateien sein
Der Header wird an der entsprechenden Stelle ausgelesen (siehe Tabelle).
Die Versteckdatei beim Chiffrieren muß mindestens acht mal so groß sein, wie die Geheimdatei
Dies wird überprüft, indem der Dateizeiger unter C auf das Ende der Datei gesetzt wird. Über die ANSI-C Funktion ftell() wird die Dateilänge ermittelt.
Das Programm dechiffriert nur die von dem Programm GBMSYS chiffrierten Dateien. Hierzu wird eine Kennzeichnung in die Versteckdatei geschrieben, die mit GBMSYS chiffrierte Dateien kennzeichnet.
Bei dem Chiffrieralgorithmus war es erst einmal wichtig, das LSB von den anderen Bits zu trennen. Um es zu verarbeiten, haben wir den folgenden Algorithmus erarbeitet:
Der Chiffrieralgorithmus liest das erste Byte der Geheimdatei
aus. Danach durchläuft das Programm eine Schleife, die von 0 bis
7 zählt, um alle 8 Bit des Datenbytes ansprechen zu können. Dies
geschieht in dem man das Datenbyte mit
Vor dem Schiebebefehl wird noch ein Versteckbyte eingelesen.
Dieses wird mit
Bei 8 Schleifendurchläufen wird so ein ganzes Byte der geheimen Nachricht in die LSBs von 8 Bytes der Versteckdatei geschrieben.
Dieser Vorgang wird mit allen Bytes der geheimen Nachricht durchgeführt (äußere Schleife).
Beim Chiffrieren mußte darauf geachtet werden, daß die komplette Geheimdatei inklusive Header und Daten verarbeitet wird, damit diese später wieder als vollständige WAV-Datei rekonstruiert werden kann.
Zum Chiffrieren von 1 Byte der Geheimdatei werden - wie aus der schematischen Darstellung ersichtlich - 8 Bytes in der Versteckdatei benötigt, ferner soll diese Zeichnung den Übergang von den einzelnen Bits der Geheimdatei in die LSBs der Versteckdatei darstellen.

Beim Dechiffrieren muß erreicht werden, daß aus den LSBs der Versteck-Bytes wieder das ganze Byte der geheimen Nachricht "zusammengebaut" wird.
Dafür lesen wir 8 Byte der Versteckdatei ein und
schreiben sie in ein 8 Byte großes Array. Nun schieben wir das 1.
Byte des Arrays um 7 Bit nach links, danach wieder 7 Bit nach rechts. Das
2. Byte des Arrays schieben wir 7 Bit nach links, danach 6 Bit nach rechts. Das
3. Byte des Arrays schieben wir 7 Bit nach links, danach 5 Bit nach rechts,
Das Schieben um 7 Bit nach links isoliert das LSB, das Schieben nach rechts setzt das geheime Bit an die ihm entsprechende Stelle im Byte. Danach werden alle 8 Bytes des Arrays miteinander ODER verknüpft und wir erhalten das versteckte Byte.
Mit Hilfe der Dateigröße der Geheimdatei, die wir an den Anfang des Datenchunks geschrieben haben, lesen wir alle Bytes der geheimen Nachricht aus der Versteckdatei aus (Schleife).

