Hi,
deine Idee ist richtig, über den Weg (das Script) kann man diskutieren
Nur zur Info, die "Pixel" eines Bildes kann man einfach in eine Struct (das ist nichts anderes als ein Array) laden
AutoIt
#include <GDIPlus.au3>
#include <GDIPlusConstants.au3>
_GDIPlus_Startup()
$sFile = FileOpenDialog("Datei", @ScriptDir, "Bilder (*.jpg;*.bmp;*.png)");"mona-lisa.jpg"
$himage = _GDIPlus_ImageLoadFromFile($sFile) ;Bild laden
$iHeight = _GDIPlus_ImageGetHeight($himage) ;höhe
$iWidth = _GDIPlus_ImageGetWidth($himage) ;breite
$tBitmapData = DllStructCreate("byte[" & 4 * $iWidth * $iHeight & "]") ;4 byte/pixel
$ptr_bitmap = DllStructGetPtr($tBitmapData) ; pointer auf die Bitmapdaten
$hBitmap = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight, $GDIP_PXF32ARGB, 4 * $iWidth, $ptr_bitmap)
$hCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap) ;Kontext
_GDIPlus_GraphicsDrawImage($hCtxt, $himage, 0, 0) ;Pixel in Kontext schreiben
$Pixel = DllStructGetData($tBitmapData, 1) ;Pixeldaten auslesen
$binary = StringToBinary($Pixel) ;im Binaryformat
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $binary = ' & StringLeft($binary, 100) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
Alles anzeigen
Das nützt aber nicht viel, da die oberen Bits der Farbanteile abhängig vom Bild sind, bei "bearbeiteten" Bildern natürlich noch mehr! Und alles, was Bilder komprimiert (jpg usw) filtert diese (zufälligen) Anteile gnadenlos raus!
Aber egal, soll ja nur eine Demo sein, wir "verschlüsseln" einen Text mit den Pixeln eines Bildes:
AutoIt
#include <GDIPlus.au3>
#include <GDIPlusConstants.au3>
$text = "Hallo dieser Text wird mit den Pixeln eines Bildes verschlüsselt!"
_GDIPlus_Startup()
$sFile = FileOpenDialog("Datei", @ScriptDir, "Bilder (*.jpg;*.bmp;*.png)");"mona-lisa.jpg"
$himage = _GDIPlus_ImageLoadFromFile($sFile) ;Bild laden
$iHeight = _GDIPlus_ImageGetHeight($himage) ;höhe
$iWidth = _GDIPlus_ImageGetWidth($himage) ;breite
$tBitmapData = DllStructCreate("byte[" & 4 * $iWidth * $iHeight & "]") ;4 byte/pixel
$ptr_bitmap = DllStructGetPtr($tBitmapData) ; pointer auf die Bitmapdaten
$hBitmap = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight, $GDIP_PXF32ARGB, 4 * $iWidth, $ptr_bitmap)
$hCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap) ;Kontext
_GDIPlus_GraphicsDrawImage($hCtxt, $himage, 0, 0) ;Pixel in Kontext schreiben
$Pixel = BinaryToString(DllStructGetData($tBitmapData, 1)) ;Pixeldaten auslesen
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $Pixel = ' & StringLeft($Pixel, 100) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
;verschlüsseln, in den ersten 4 byte steht die Länge des Textes, oder die startadresse innerhalb des strings ^^
$lenstruct = DllStructCreate("dword") ;4 bytes
DllStructSetData($lenstruct, 1, StringLen($text)) ;länge eintragen
$verschluesselt = Hex(DllStructGetData($lenstruct, 1), 8) ;erste 4 bytes sind die länge
For $i = 1 To StringLen($text) ;alle Buchstaben
$pixelbytes = Asc(StringMid($Pixel, $i, 1)) ;bytes aus den Bilddaten
$textbuchstabe = Asc(StringMid($text, $i, 1)) ;Textbuchstaben
$verschluesselt &= Hex(BitXOR($pixelbytes, $textbuchstabe), 2);XOR, was sonst^^, man könnte ggf. noch bits rotieren...aber wieso?
Next
MsgBox(0, "Verschlüsselt", "Bytes:" & @CRLF & $verschluesselt &@crlf&@crlf&"als Text:"&@crlf&binarytostring("0x"&stringtrimleft($verschluesselt,8)))
;entschlüsseln
$entschluesselt = ""
$lenstruct = DllStructCreate("dword") ;4 bytes für textlänge oder startadresse
DllStructSetData($lenstruct, 1, Dec(StringLeft($verschluesselt, 8))) ;länge(oder startadresse) auslesen
$textlen = DllStructGetData($lenstruct, 1)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $textlen = ' & $textlen & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
$verschluesselt = StringTrimLeft($verschluesselt, 8) ;länge abschneiden
For $i = 1 To $textlen ;alle Buchstaben
$pixelbytes = Asc(StringMid($Pixel, $i, 1)) ;bytes aus den Bilddaten
$textbuchstabe = Dec(StringMid($verschluesselt, $i * 2 - 1, 2)) ;Bytes aus Verschlüsselung
$entschluesselt &= Chr(BitXOR($pixelbytes, $textbuchstabe)) ;XOR, was sonst^^, man könnte ggf. noch bits rotieren...aber wieso?
Next
MsgBox(0, "Entschlüsselt", "Text:" & @CRLF & $entschluesselt)
Alles anzeigen