Egal welche Verschlüsselungsmethode angewendet wird, der Schlüssel und/oder das Passwort hat in keinem AutoIt-Script bzw auf einem Rechner etwas zu suchen! Der gehört, genau wie Zugangspasswörter oder Pin-Nummern, in einen "Datasafe" ins Portemonnaie. Wenn es Hackern irgendwann gelingt, an bzw. in meine Geldbörse zu kommen, fange ich an, mir Gedanken zu machen!
Wenn es um wichtige Firmendaten geht, ist man mit den "herkömmlichen" Methoden (z.B. AES) am besten dran, aber nicht etwa, weil die besonders sicher sind, sondern weil im allerschlimmsten Fall (Schlüssel/Passwort verloren) eine Rekonstruktion der Daten möglich ist! Das lassen sich aber darauf spezialisierte Firmen fürstlichst bezahlen.
Um geklaute MP3´s oder die Pornosammlung vor Mama zu verbergen, reichen die "billigen" Verfahren idR aus.
Viel spannender als die plumpe Verschlüsselung ist aber das Verstecken von Daten in der Öffentlichkeit, jedermann hat Zugriff, aber niemand "sieht" das Geheimnis, die sogenannte Steganographie. Anbei ein Beispiel, bei dem "unsichtbar" ein bis zu 819 Buchstaben langer Text in einem 32x32-Icon "versteckt" wird, ohne daß man eine Änderung am Icon erkennen kann. Damit die kleinen Icons in der GUI nicht gar so winzig sind, habe ich sie auf 100x100Pixel "gestretchblittet". Und wer es nicht glaubt, daß sich das "Orginal" und das Icon mit integriertem Text nicht unterscheiden, kann sie gerne abspeichern und dann mit einem Hexeditor betrachten^^
Spoiler anzeigen
;eine Text-Nachricht mit bis zu 819 Zeichen wird "unsichtbar" im AutoIt-Icon versteckt und wieder extrahiert
;Beispiel für Steganographie von Andy
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#include <WinAPIEx.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>
#include <EditConstants.au3>
Local $hGUI, $hEdit, $hicon
Local $pointer_icon, $hbmp_icon ;pointer und handle icon
Local $pointer_stegano, $hbmp_stegano ;pointer und handle stegano
local $pointer_diff, $hbmp_diff ;pointer und handle differenzbild
$hGUI = GUICreate("Beispiel für Steganographie", 560, 300) ;GUI
$label1=GUICtrlCreateLabel("Orginal Icon Icon mit integriertem Text Differenzbild 64-fach verstärktes Differenzbild",10,10)
$label2=GUICtrlCreateLabel("Der im Icon versteckte Text:",10,170)
$label3=GUICtrlCreateEdit("",10,195,530,100,$ES_READONLY,0)
$hdc_gui = _WinAPI_GetDC($hGUI) ;DeviceContext der Gui
GUISetState()
$hDC_icon = _CreateNewBmp32(32, 32, $pointer_icon, $hbmp_icon) ;neue 32-Bit-Bitmap erstellen, Rückgabe: DC, Pointer und Handle
[/autoit] [autoit][/autoit] [autoit]Local $hicon = DllStructCreate("ptr") ;platz für Pointer des/der Icon(s)
_WinAPI_ExtractIconEx(@AutoItExe, 0, DllStructGetPtr($hicon), 0, 1) ;AutoIt-Icon holen (Zeiger auf die Liste der Handles)
$hicon = DllStructGetData($hicon, 1) ;Handle des Icons holen
$anz = _WinAPI_DrawIconEx($hDC_icon, 0, 0, $hicon, 32, 32, 0, _WinAPI_GetSysColorBrush(2), 3) ;Icon in den Buffer "zeichnen"
_WinAPI_StretchBlt($hdc_gui, 10, 50, 100, 100, $hDC_icon, 0, 0, 32, 32, $SRCCOPY) ;Icon mit 3-facher Größe in die GUI kopieren
;In diesem Icon wird eine "Nachricht" versteckt, indem ein Text (maximal 819 Zeichen) in die beiden untersten Bits jeder "Pixel"-farbe
;kodiert wird. 819 = 32 Pixel * 32 Pixel * 4 Byte pro Pixel (Anzahl Bytes des Icons) / 5 (in 5 Bytes wird ein "Buchstabe" versteckt)
;32 Bit pro Pixel= 4 Byte = BBGGRRAA Alphakanal wird nicht verwendet bzw verändert, so kann man auch transparente Icons/Bilder benutzen
;Es wird eine neue Bitmap erstellt (_stegano) und diese aus den obersten 6 Bit der Farbe des Orginal-Icons mit den Bits der
;Nachricht, welche die untersten beiden Bits der Farb-Bytes enthalten, zusammenkopiert
;32 Bit pro Pixel BBBBBBTTGGGGGGTTRRRRRRTTAAAAAAAA TT= Bits eines Buchstabens aus dem Text
;das nachfolgende Script kann immens gekürzt werden, allerdings auf kosten der Übersichtlichkeit und des Verständnisses^^
$Text = "Hallo, diese Nachricht ist im AutoIt-Icon versteckt!"&@crlf ;versteckte Nachricht
$text&="Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo."
;den Text in 2-Bit lange Teilstücke auftrennen
Dim $bitarray[32 * 32 * 4] ;Platz für die 2-Bit-Stücke 8 Bit = 4 * 2 Bit
For $i = 1 To StringLen($Text) ;jeden Buchstaben im Text holen
$byte = Asc(StringMid($Text, $i, 1)) ;ascii-code der einzelnen Buchstaben holen
$bitarray[($i - 1) * 4 + 0] = BitShift($byte, 6) ;oberste 2 bit
$bitarray[($i - 1) * 4 + 1] = BitShift(BitAND($byte, 48), 4) ;nächste 2 bit AND 00110000, bitshift 4
$bitarray[($i - 1) * 4 + 2] = BitShift(BitAND($byte, 12), 2) ;nächste 2 bit AND 00001100 bitshift 2
$bitarray[($i - 1) * 4 + 3] = BitAND($byte, 3) ;unterste 2 bit AND 00000011
Next
;unterste 2 Bit aus jedem Byte des Icons mit den 2 Byte des Textes ersetzen
$hDC_stegano = _CreateNewBmp32(32, 32, $pointer_stegano, $hbmp_stegano) ;neue 32-Bit-Bitmap erstellen, Rückgabe: DC, Pointer und Handle
$struct_stegano = DllStructCreate("byte [" & 32 * 32 * 4 & "]", $pointer_stegano) ;struct mit der größe der Bitmap an der Position der "Kopie"
$struct_icon = DllStructCreate("byte [" & 32 * 32 * 4 & "]", $pointer_icon) ;struct mit der größe der Bitmap an der Position des Icons
$bitarray_count = 0 ;zähler für den Index des Bitarray
For $y = 0 To 31 ;spaltenweise Pixel ändern
For $x = 0 To 31 ;zeilenweise Pixel ändern
;Pixel-farbanteile aus dem Icon holen
$B = DllStructGetData($struct_icon, 1, $y * 128 + ($x * 4) + 1) ;blau-anteil des Pixels
$G = DllStructGetData($struct_icon, 1, $y * 128 + ($x * 4) + 2) ;gruen-anteil des Pixels
$R = DllStructGetData($struct_icon, 1, $y * 128 + ($x * 4) + 3) ;rot-anteil des Pixels
$A = DllStructGetData($struct_icon, 1, $y * 128 + ($x * 4) + 4) ;Alpha-anteil des Pixels (wird nicht verändert)
;die untersten 2 Byte der farbanteile "löschen"
$B = BitAND($B, 252) ;AND 11111100 setzt die unteren beiden bit auf 0, alle anderen bleiben erhalten
$G = BitAND($G, 252)
$R = BitAND($R, 252)
;Bits aus dem Bitarray dazuaddieren
$B = $B + $bitarray[$bitarray_count * 3 + 0] ;2 bits aus dem Bitarray in das Byte an unterster position einfügen
$G = $G + $bitarray[$bitarray_count * 3 + 1]
$R = $R + $bitarray[$bitarray_count * 3 + 2]
$bitarray_count += 1 ;zähler erhöhen, nächste 3 2er Bits
;mit dem Text modifizierte Farbbytes in Zielbitmap einfügen
DllStructSetData($struct_stegano, 1, $B, $y * 128 + ($x * 4) + 1) ;blau-anteil in _stegano-bitmap eintragen
DllStructSetData($struct_stegano, 1, $G, $y * 128 + ($x * 4) + 2) ;grün-anteil in bitmap eintragen
DllStructSetData($struct_stegano, 1, $R, $y * 128 + ($x * 4) + 3) ;rot-anteil in bitmap eintragen
DllStructSetData($struct_stegano, 1, $A, $y * 128 + ($x * 4) + 4) ;alpha-anteil in bitmap eintragen
Next
Next
;_stegano-Icon in GUI darstellen
_WinAPI_StretchBlt($hdc_gui, 140, 50, 100, 100, $hDC_stegano, 0, 0, 32, 32, $SRCCOPY) ;Icon mit 3-facher Größe in die GUI kopieren
;Text aus dem _stegano-Icon extrahieren
Dim $char_array[32 * 32 * 4] ;platz für die 2-Bit-stücke machen
$char_array_count = 0
For $y = 0 To 31 ;spaltenweise Pixel auslesen
For $x = 0 To 31 ;zeilenweise Pixel auslesen
;Pixel-farbanteile aus dem Icon holen
$B = DllStructGetData($struct_stegano, 1, $y * 128 + ($x * 4) + 1) ;blau-anteil des Pixels
$G = DllStructGetData($struct_stegano, 1, $y * 128 + ($x * 4) + 2) ;gruen-anteil des Pixels
$R = DllStructGetData($struct_stegano, 1, $y * 128 + ($x * 4) + 3) ;rot-anteil des Pixels
;die untersten 2 Byte der farbanteile "herauslösen"
$char_array[$char_array_count * 3 + 0] = BitAND($B, 3) ;AND 00000011 löscht die oberen 6 bit, die beiden unteren bleiben erhalten
$char_array[$char_array_count * 3 + 1] = BitAND($G, 3)
$char_array[$char_array_count * 3 + 2] = BitAND($R, 3)
;Bits aus dem Bitarray dazuaddieren
$char_array_count += 1 ;zähler erhöhen, nächste 3 2er Bits
Next
Next
$string = "" ;extrahierter text
For $i = 0 To UBound($char_array) - 1 Step 4
$char = $char_array[$i] * 64 ;oberste 2bit
$char += $char_array[$i + 1] * 16 ;nächste 2 bit
$char += $char_array[$i + 2] * 4 ;nächste 2 bit
$char += $char_array[$i + 3] ;unterste 2 bit
$string &= Chr($char) ;8 Bit = 1 Byte = 1 char
Next
GUICtrlSetData($label3, $string) ;text in GUI anzeigen
[/autoit] [autoit][/autoit] [autoit];differenzbild in der GUI anzeigen
_WinAPI_StretchBlt($hdc_gui, 280, 50, 100, 100, $hDC_Icon, 0, 0, 32, 32, $SRCCOPY) ;Orginal Icon mit 3-facher Größe in die GUI kopieren
_WinAPI_StretchBlt($hdc_gui, 280, 50, 100, 100, $hDC_stegano, 0, 0, 32, 32, $MERGEPAINT) ;stegano-Icon mit 3-facher Größe in die GUI kopieren und mit dem Orginal XOR-Verknüpfen
;da nur sehr kleine Änderungen vorhanden sind, muss das Differenzbild für die anzeige verstärkt werden...
;dazu werden die einzelnen Farbanteile des Differenzbildes mit 64 multipliziert!
;Differenzbild erstellen
$hDC_diff=_CreateNewBmp32(32, 32, $pointer_diff, $hbmp_diff) ;neue 32-Bit-Bitmap erstellen, Rückgabe: DC, Pointer und Handle
$struct_diff=dllstructcreate("byte ["&32*32*4&"]",$pointer_diff) ;struct an position des diff-bildes
_WinAPI_BitBlt($hdc_diff, 0,0, 32, 32, $hDC_Icon, 0, 0, $SRCCOPY) ;Orginal Icon ins DIFF kopieren
_WinAPI_BitBlt($hdc_diff, 0,0, 32, 32, $hDC_stegano, 0, 0, $mergepaint) ;stegano-Icon DIFF kopieren und mit dem Orginal XOR-Verknüpfen
For $y = 0 To 31 ;spaltenweise Pixel ändern
For $x = 0 To 31 ;zeilenweise Pixel ändern
;Pixel-farbanteile aus dem Icon holen
$B = DllStructGetData($struct_diff, 1, $y * 128 + ($x * 4) + 1) ;blau-anteil des Pixels
$G = DllStructGetData($struct_diff, 1, $y * 128 + ($x * 4) + 2) ;gruen-anteil des Pixels
$R = DllStructGetData($struct_diff, 1, $y * 128 + ($x * 4) + 3) ;rot-anteil des Pixels
$A = DllStructGetData($struct_diff, 1, $y * 128 + ($x * 4) + 4) ;Alpha-anteil des Pixels (wird nicht verändert)
;die untersten 2 Byte der farbanteile mit 64 multiplizieren
;geänderte bytes zurückschreiben
DllStructSetData($struct_diff, 1, $B*64, $y * 128 + ($x * 4) + 1) ;blau-anteil in _diff-bitmap eintragen
DllStructSetData($struct_diff, 1, $G*64, $y * 128 + ($x * 4) + 2) ;grün-anteil in bitmap eintragen
DllStructSetData($struct_diff, 1, $R*64, $y * 128 + ($x * 4) + 3) ;rot-anteil in bitmap eintragen
DllStructSetData($struct_diff, 1, $A, $y * 128 + ($x * 4) + 4) ;alpha-anteil in bitmap eintragen
Next
Next
_WinAPI_StretchBlt($hdc_gui, 400, 50, 100, 100, $hDC_diff, 0, 0, 32, 32, $SRCCOPY) ;Differenzbild mit 3-facher Größe in die GUI kopieren
; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
Do
$nMsg = GUIGetMsg()
Until $nMsg = $GUI_EVENT_CLOSE
Func _CreateNewBmp32($iwidth, $iheight, ByRef $ptr, ByRef $hbmp) ;erstellt leere 32-bit-Bitmap; Rückgabe DC und ptr und handle auf die Bitmapdaten
;by Andy
Local $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
Local $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
DllStructSetData($tBMI,1, DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
DllStructSetData($tBMI,2, $iwidth)
DllStructSetData($tBMI,3, -$iheight) ;minus =standard = bottomup
DllStructSetData($tBMI,4, 1)
DllStructSetData($tBMI,5, 32) ;32 Bit = 4 Bytes => AABBGGRR
Local $adib = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', $DIB_RGB_COLORS, 'ptr*', 0, 'ptr', 0, 'uint', 0)
$hbmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
$ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
;_arraydisplay($adib)
_WinAPI_SelectObject($hcdc, $hbmp) ;objekt hbitmap in DC
Return $hcdc ;DC der Bitmap zurückgeben
EndFunc ;==>_CreateNewBmp32