Dateien in sogenannten Containern verschlüsseln?!

  • Hallo AutoIt-Programmierer,

    ich möchte mal gerne wissen, ob man mit AutoIt Dateien, wie z.B. .txt, jpg, exe, usw. in eine Container-Datei, mit einer eigene Dateiendung, wie z.B. .test (als Beispiel) speichern und verschlüsseln kann?

    MfG

    MehmeX

  • Erstelle mit FileWrite eine neue Datei und schreibe da den mit z.B. _StringEncrypt verschlüsselten Text der zu packenden Datei rein ;).
    Aber wozu das Rad neu erfinden? Es gibt bereits zip, rar etc. :D

    Wer das Rad nicht neu erfindet, kann es auch nicht verbessern. ;)
    Ausserdem ist das schon nützlich, wenn man sich zum Beispiel ein Tagebuch coded, will man ja nicht jeden Eintrag mit ZIP kompressen müssen - dafür ist AutoIt doch da. ;)

  • Wenn ich eine Datei mit _Stringencrypt() verschlüssele, dann wird z.B. die 10 KB-Datei zu eine 20 oder 30 KB. Gibt es nicht eine andere Lösung, also die gelesene Datei (Binär einlesen) und es in eine neue Datei schreiben und diese dann extra verschlüsseln? Oder muss ich den gesamten Binärcode verschlüsseln, also mit _Stringencrypt()?

  • Zitat

    Wenn ich eine Datei mit _Stringencrypt() verschlüssele, dann wird z.B. die 10 KB-Datei zu eine 20 oder 30 KB. Gibt es nicht eine andere Lösung, also die gelesene Datei (Binär einlesen) und es in eine neue Datei schreiben und diese dann extra verschlüsseln? Oder muss ich den gesamten Binärcode verschlüsseln, also mit _Stringencrypt()?


    Wenn du mit StringEncrypt arbeitest wird die Datei in jedem Fall größer ;).

  • die Crypt UDF ist recht gut ... hab damit auch mal versucht dateien zu verschlüsseln und das ging echt wahnsinnig schnell ...

  • Hi,
    wenn du reinen Text verschlüsseln möchtest, könntest du 7- oder sogar 6-Bit statt der "üblichen" 8 Bit für eine Buchstabendarstellung benutzen. Dadurch spart man schon (bei 7 statt 8 Bit) 12,5% ein, und eine "Verschlüsselung" bekommt man gewissermassen automatisch dazugeschenkt.

    Man ermittelt den Ascii-code der Buchstaben, wandelt die so erhaltene Zahl in 8-Bit, streicht das achte Bit und schreibt alle so erhaltenen Bits hintereinander. Dann wird diese Bitfolge wieder in 8 Bit-"Stücke" aufgeteilt und diese dann wiederum in eine Zahl bzw Ascii-code umgewandelt.

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    $text=inputbox("Verschlüsselung 8 nach 7 Bit","Bitte Text eingeben:","Dieser Text ist mit 7-Bit verschlüsselt")

    [/autoit] [autoit][/autoit] [autoit]

    $siebenbit=ascii2siebenbit($text) ;aus dem 8-bit text einen "7-bit"-binärstring machen
    MsgBox(262144,'7-Bit-Binärstring erstellen','Selection:' & @lf & '$siebenbit' & @lf & @lf & 'Return:' & @lf & $siebenbit) ;### Debug MSGBOX

    [/autoit] [autoit][/autoit] [autoit]

    $codiert=bin2ascii($siebenbit) ;Binärstring als 8-bit-ascii darstellen
    MsgBox(262144,'7-Bit-Binärstring als 8-Bit darstellen (Codierter Text)','Selection:' & @lf & '$codiert' & @lf & @lf & 'Return:' & @lf & $codiert) ;### Debug MSGBOX

    [/autoit] [autoit][/autoit] [autoit]

    $dekodiert=siebenbit2achtbitascii($codiert);aus 7-Bit wieder 8-bit-text machen
    MsgBox(262144,'aus dem 8-Bit-Text wieder 7-Bit-Text machen und darstellen' ,'Selection:' & @lf & '$dekodiert' & @lf & @lf & 'Return:' & @lf & $dekodiert) ;### Debug MSGBOX

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    func siebenbit2achtbitascii($siebenbit_string)
    $binaerstring=ascii2bin($siebenbit_string) ;asciizeichen in binärstring umwandeln
    $step = 7 ;7-Bit ASCII Buchstaben
    $ascii_string = "" ;Rückgabestring
    For $f = 1 To StringLen($binaerstring) Step $step ;string von Vorne nach hinten 7-bitweise durchsuchen
    $t = StringMid($binaerstring, $f, $step) ; 7-Bit-Wort, ein ASCII-Buchstabe
    $bin = 0 ;startwert für
    For $i = 1 To $step ;jedes Bit suchen
    If StringMid($t, $i, 1) = "1" Then $bin += (2 ^ ($step - $i)) ;wenn Bit=1 dann binärzahl=binärzahl+2^(8-Bitposition)
    Next
    $ascii_string &= Chr($bin) ;aus der zahl einen buchstaben machen
    Next
    Return $ascii_string
    endfunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    func ascii2siebenbit($text) ;aus 8-bit ascii einen 7-bit binärstring machen
    $bin_string=""
    for $x=1 to stringlen($text) ;jeden buchstaben im text umwandeln
    $asciicode=asc(stringmid($text,$x,1)) ;ascii-code des buchstaben ermitteln
    for $i=6 to 0 step -1 ;asciicode in SIEBEN bits (das 8. bit wird nicht beachtet!)
    if bitand($asciicode,2^$i) then ;alle bits hintereinander schreiben
    $bin_string&="1"
    else
    $bin_string&="0"
    endif
    next
    Next
    return $bin_string
    endfunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func bin2ascii($bin_string) ;string aus nullen und einsen in 8-bit-ascii text string umwandeln
    $step = 8 ;8-Bit ASCII Buchstaben
    $ascii_string = "" ;Rückgabestring
    For $f = 1 To StringLen($bin_string) Step $step ;string von Vorne nach hinten 8-bitweise durchsuchen
    $t = StringMid($bin_string, $f, $step) ; 8-Bit-Wort, ein ASCII-Buchstabe
    $bin = 0 ;startwert für
    For $i = 1 To $step ;jedes Bit suchen
    If StringMid($t, $i, 1) = "1" Then $bin += (2 ^ ($step - $i)) ;wenn Bit=1 dann binärzahl=binärzahl+2^(8-Bitposition)
    Next
    $ascii_string &= Chr($bin)
    Next
    Return $ascii_string
    EndFunc ;==>bin2ascii

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    func ascii2bin($ascii_string) ;ascii in binärstring darstellen
    $step=8 ;8-Bit ASCII Buchstaben
    $bin_string=""
    for $t=1 to stringlen($ascii_string) ;jeden Buchstaben im String
    $asciicode=asc(stringmid($ascii_string,$t,1)) ;in asciicode umwandeln
    for $i=7 to 0 step -1 ;asciicode in bits
    if bitand($asciicode,2^$i) then
    $bin_string&="1"
    else
    $bin_string&="0"
    endif
    next
    next
    return $bin_string
    endfunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]


    Die Funktionen ascii2bin() und bin2ascii() hatte ich mal HIER vorgestellt.

    Hausaufgabe:
    Schreibe das Script so um, daß auch Ascii-Zeichen größer als 127 (z.B. die Umlaute äöü oder ß) in 7 bit codiert bzw dekodiert werden? (TIP: es gibt in der Ascii-code Tabelle Zeichen kleiner als 32, die idR nie in "normalem" Text genutzt werden)

  • Die "billigste", schnellste, sicherste und auch 100% unknackbare Verschlüsselung erfolgt simpelst per XOR und einem Zufallsschlüssel. Dabei bleibt die Größe der zu verschlüsselnden Datei gleich. Ein nochmaliges XOR der verschlüsselten Datei mit dem Schlüssel erzeugt wieder die Ursprungddatei.
    Nun kann man, genau wie bei allen anderen Verschlüsselungsmethoden auch, versuchen die Schlüssellänge auf ein handhabbares Maß zu verkleinern. Da bieten sich dann Rotations- oder Austauschmethoden an, bei denen der "kurze" Schlüssel zu einem "langen" Schlüssel wird.

    So könnte man bspw, aus dem Schlüssel "Test" einfach den längeren Schlüssel "TestTestTest" oder "TTTeeesssttt" oder "TestestTstTe" oder oder oder machen, und diesen dann per XOR mit dem Ursprung verschlüsseln.

    Spoiler anzeigen
    [autoit]

    $text="Dies ist ein verschlüsselter Text!"
    $Passwort="AutoIt"

    [/autoit] [autoit][/autoit] [autoit]

    $crypt=_XOR_Crypt($text,$passwort)
    MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$crypt' & @lf & @lf & 'Return:' & @lf & $crypt) ;### Debug MSGBOX

    [/autoit] [autoit][/autoit] [autoit]

    $text=_XOR_Crypt($crypt,$passwort)
    MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$text' & @lf & @lf & 'Return:' & @lf & $text) ;### Debug MSGBOX

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    func _XOR_Crypt($file,$pass) ;kodieren und dekodieren per XOR
    $crypt=""
    for $i=1 to stringlen($file)
    $crypt&=chr(BitXOR(asc(stringmid($file,$i,1)),asc(stringmid($pass,mod($i,stringlen($pass)),1))))
    next
    return $crypt
    endfunc

    [/autoit]