Häufigkeitsverteilung
-
-
Eine "nicht sicherere" Methode um Text zu verschlüsseln habe ich irgendwann auch mal gebastelt. Der Code ist sogar Kommentiert, da hatte ich wohl zu viel Freizeit
Prinzip ist:
1. Starte einen RNG (hier XORShift) und generiere damit ein "one time pad" (eigentlich ist es ja keins, weil die Zahlen nicht "zufällig" sind)
2. Modifiziere den RNG andauernd mit einzelnen Buchstaben aus dem PW, sodass jedes PW ein einzigartiges OTP erzeugt.
2.5. Lasse das OTP (+Modifikationen) noch ein paar mal durch den RNG laufen damit sich einzelne Änderungen (z.B. nur 1 Buchstabe im PW) besser auf das gesamte OTP verteilen.
3. XOR mit dem OTP
Vorteile:
- Extrem einfach.
- Vorallem in anderen Programmiersprachen unfassbar schnell (es sind hier nur Shift, XOR und Additionen im inner Loop)
- Da XORShift ziemlich gleichverteilt läuft sind auch die verschlüsselten Strings ziemlich gleichverteilt.
- Das Verfahren ist zum ver- und entschlüsseln identisch.
Nachteile:
- Jeder mit 5 Minuten Ahnung im Bereich Programmierung kann die Verschlüsselung knacken.
- In AutoIt nicht so schnell, als dass man damit größere Dateien verschlüsseln kann.
AutoIt
Alles anzeigen#include-once #include <Array.au3> If @ScriptName = 'StringXorWithPW.au3' Then Local $sString = 'Ich Bin ein Test, hier könnte im Prinzip nahezu alles stehen. Ich schreibe hier einfach etwas lustiges hin :)' & @CRLF & _ 'Noch eine Zeile, damit der Text länger wird. So lob ich mir das. ABC die Katze läuft im Schnee.' Local $sPW = 'Hi' ; Das ist das Passwort Local $_ = StringCount($sString) _ArrayDisplay($_) Local $sEncrypted = StringXorWithPW($sString, $sPW) Local $_ = StringCount(BinaryToString($sEncrypted)) _ArrayDisplay($_) ConsoleWrite($sEncrypted & @CRLF) Local $sDecrypted = BinaryToString(StringXorWithPW($sEncrypted, $sPW)) ConsoleWrite($sDecrypted & @CRLF) EndIf Func StringCount($s) Local $a[256][2] For $i = 1 To StringLen($s) Step 1 $a[Asc(StringMid($s, $i, 1))][0] = Asc(StringMid($s, $i, 1)) $a[Asc(StringMid($s, $i, 1))][1] += 1 Next _ArraySort($a, 1, 0, 0, 1) For $i = 0 To UBound($a) - 1 Step 1 If Not $a[$i][0] Then ExitLoop Next ReDim $a[$i][2] Return $a EndFunc Func StringXorWithPW($sString, $sPW, $bReturnStruct = False) Local $iLen = IsBinary($sString) ? BinaryLen($sString) : StringLen($sString), $vStr = DllStructCreate('byte[' & $iLen & ']') DllStructSetData($vStr, 1, IsBinary($sString) ? BinaryToString($sString) : $sString) Local $vOtp = StringToOneTimePad($sPW, $iLen, True) For $i = 1 To $iLen Step 1 DllStructSetData($vStr, 1, BitXOR(DllStructGetData($vStr, 1, $i), DllStructGetData($vOtp, 1, $i)), $i) Next Return $bReturnStruct ? $vStr : DllStructGetData($vStr, 1) EndFunc Func StringToOneTimePad($sPW, $iLen, $bReturnStruct = False) Local $vOtp = DllStructCreate('byte[' & $iLen & ']') ; Wir arbeiten in einer Struct. If StringLen($sPW) > $iLen Then ; Falls das Passwort länger als das zu generierende OTP ist. Local $a = StringToOneTimePad(StringLeft($sPW, StringLen($sPW) / 2), $iLen, True) Local $b = StringToOneTimePad(StringRight($sPW, StringLen($sPW) / 2), $iLen, True) For $i = 1 To $iLen Step 1 ; ein OTP in voller länger für beide Hälften des PW Ausrechnen -> XOR -> Fertig. DllStructSetData($vOtp, 1, BitXOR(DllStructGetData($a, 1, $i), DllStructGetData($b, 1, $i)), $i) Next ; Da Rekursiv werden automatisch alle Variationen abgefangen (z.B. wenn das PW nach 1 Rekursion immernoch zu kurz ist) Else While StringLen($sPW) < $iLen ; Erstmal die Struct komplett auffüllen. $sPW &= $sPW ; Hier ist das OTP noch ziemlich schwach weil einfach nur das PW wiederholt wird. WEnd DllStructSetData($vOtp, 1, StringLeft($sPW, $iLen)) Local $z = 314159265 + StringLen($sPW) + $iLen ; Irgendeine Magic Number um XorShift zu starten ; Idee: ; Nutze XorShift um Pseudozufallszahlen zu generieren (ja ich weiß die sind nicht besonders "sicher"). ; Modifiziere den Inneren Zustand in jedem Schritt mit einem Teil des Passworts. ; Nimm irgendeinen Teil des Zustands als Output (z.B. BitAND(BitShift($z, 7), 0xFF)) ; Arbeite Inplace und laufe 2+ Mal die komplette Struct ab. ; Grund dafür ist, dass eine Änderung am PW (z.B. die letze Stelle wurde geändert) erstmal nur ; den Output beeinflusst der nach dem erstmaligen Auftreten dieser Stelle berechnet wird. Läuft ; man aber 2+ Runden und nimmt den Inneren Zustand mit, so wird der gesamte Output vom gesamten Input beeinflusst. For $e = 0 To 2 Step 1 ; 2 Runden (Editors note: 0, 1, 2 -> also 3 Runden... :D) For $i = 1 To $iLen Step 1 $z = BitXOR($z, BitShift($z, -13), DllStructGetData($vOtp, 1, $i)) ; Hier werden die Low8 Bit mit dem String geXORt. $z = BitXOR($z, BitShift($z, 17)) $z = BitXOR($z, BitShift($z, 5)) DllStructSetData($vOtp, 1, BitAND(BitShift($z, 7), 0xFF), $i) ; Das shr7 ist ausgedacht. Hier kann jede Zahl stehen. Next Next EndIf Return $bReturnStruct ? $vOtp : DllStructGetData($vOtp, 1) EndFunc
lg
M
-
Danke, das habe ich mir mal durchgelesen ! Daumen hoch! Das hilft mir und Hilfe ist immer guuuuut.