C# :: Aufgabe #89 :: Lösung #1
3 Lösungen

#89
Verschlüsseln durch Verstecken
Fortgeschrittener - C#
von eulerscheZhl
- 27.02.2015 um 18:06 Uhr
Ein Teilgebiet der Kryptographie ist die Steganographie. Hier geht es darum Informationen so zu verstecken, dass andere gar nicht auf die Idee kommen, nach versteckten Informationen zu suchen.
Ein Beispiel, um eine Datei in einem Bild zu verstecken:
Erstelle ein Bytearray mit folgendem Inhalt: die ersten 4 Byte geben die Größe der versteckten Datei in Byte an (big Endian). Danach folgt der Dateiname in ASCII Codierung. Nach einem 0-Byte zu Trennung kommt die zu versteckende Datei selbst.
Diese Daten werden nun in einem Bild versteckt, indem die niederwertigsten beiden Bit eines Pixels für rot, grün und blau überschrieben werden, sodass in jedes Pixel 6 Bit passen. Es wird im oberen linken Eck gestartet und dann die Zeile aufgefüllt, anschließend in der nächsten Zeile fortgefahren.
Das Bild im Anhang wurde auf die beschriebene Weise manipuliert.
Schreibe ein Programm, das die versteckten Daten wieder sichtbar macht.
Ein Beispiel, um eine Datei in einem Bild zu verstecken:
Erstelle ein Bytearray mit folgendem Inhalt: die ersten 4 Byte geben die Größe der versteckten Datei in Byte an (big Endian). Danach folgt der Dateiname in ASCII Codierung. Nach einem 0-Byte zu Trennung kommt die zu versteckende Datei selbst.
Diese Daten werden nun in einem Bild versteckt, indem die niederwertigsten beiden Bit eines Pixels für rot, grün und blau überschrieben werden, sodass in jedes Pixel 6 Bit passen. Es wird im oberen linken Eck gestartet und dann die Zeile aufgefüllt, anschließend in der nächsten Zeile fortgefahren.
Das Bild im Anhang wurde auf die beschriebene Weise manipuliert.
Schreibe ein Programm, das die versteckten Daten wieder sichtbar macht.
#1

von aheiland (650 Punkte)
- 06.03.2015 um 16:02 Uhr

public class SteganographieReader { enum ColorCode {RED, GREEN, BLUE} private byte oneByte; private int byteFilled; private Queue<byte> byteCollection; private StringBuilder stringBuilder; public string filename { get { return stringBuilder.ToString(); } } public void Read(string path) { collectByts(path); buildFilename(); } private void collectByts(string path) { Bitmap image = new Bitmap(path); byteCollection = new Queue<byte>(); resetByte(); for (int y = 0; y < image.Height; y++) { for (int x = 0; x < image.Width; x++) { Color pixel = image.GetPixel(x, y); for (ColorCode c = ColorCode.RED; c <= ColorCode.BLUE; c++) { decodePixel(pixel, c); } } } } private void decodePixel(Color pixel, ColorCode c) { oneByte = (byte)(oneByte << 2); switch (c) { case ColorCode.RED: { oneByte = (byte)(oneByte + (pixel.R & 3)); byteFilled = byteFilled + 2; break; } case ColorCode.GREEN: { oneByte = (byte)(oneByte + (pixel.G & 3)); byteFilled = byteFilled + 2; break; } case ColorCode.BLUE: { oneByte = (byte)(oneByte + (pixel.B & 3)); byteFilled = byteFilled + 2; break; } } if (byteFilled >= 8) { byteCollection.Enqueue(oneByte); resetByte(); } } private void resetByte() { oneByte = 0; byteFilled = 0; } private void buildFilename() { stringBuilder = new StringBuilder(); byteCollection.Dequeue(); byteCollection.Dequeue(); byteCollection.Dequeue(); byteCollection.Dequeue(); for (int i = 0; i < byteCollection.Count; i++) { byte b = byteCollection.Dequeue(); if (b == 0) break; stringBuilder.Append((char)b); } } public void WriteToBaseDir(String dir) { byte[] byts = byteCollection.ToArray(); File.Create(dir + filename).BeginWrite(byts,0,byts.Length,null,null); } }
Kommentare:
Für diese Lösung gibt es noch keinen Kommentar
Seite 1 von 0
1