Hi,
Das RC4-Verfahren ist relativ simpel, googeln hilft^^.
ZitatVerschlüsselt er es sozusagen nach der Verschlüsselung nochmal, je nachdem wie hoch das Level ist oder wie habe ich das zu verstehen?
So ähnlich funktioniert das. Im Prinzip gehts nur um vertauschen von Bytes und anschließendem XOR. Da ein zweimaliges XOR wieder zu den Ursprungsdaten führt, geht das sehr fix.
Als sehr einfaches Verschlüsselungsverfahren könnte man einen Text mit einem genau so langen Schlüssel per Byteweise XOR verschlüsseln. Bei einem zufälligen Schlüssel ist der Text nicht mehr zu dechiffrieren. Allerdings braucht man zum Entschlüsseln auch wieder den Schlüssel, bei langen Dokumenten oder großen Bildern bedeutet das die doppelte Datenmenge. Heutzutage ist das eigentlich Schnurz, aber genau wegen der gigantischen Datenmengen (die damals nicht verarbeitet werden konnten) wurden diese komplizierten Verfahren entwickelt. Man sollte mit kleinen Schlüsseln große Mengen an Daten ver- und entschlüsseln können.
Simples Beispiel:
Spoiler anzeigen
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Verschlüsseln / Entschlüsseln per XOR", 633, 453, 192, 114)
$Button = GUICtrlCreateButton("Verschlüsseln / Entschlüsseln", 200, 184, 233, 57, $WS_GROUP)
$Label1 = GUICtrlCreateLabel("Text eingeben, der Verschlüsselt oder entschlüsselt werden soll:", 16, 16, 305, 17)
$Edit1 = GUICtrlCreateEdit("Das ist ein Geheimtext", 16, 40, 601, 129)
$Edit2 = GUICtrlCreateEdit("", 16, 288, 601, 153)
[/autoit] [autoit][/autoit] [autoit]$Label2 = GUICtrlCreateLabel("Hier den Schlüssel zum Entschlüsseln eingeben oder den beim Verschlüsseln ermittelten zufälligen Schlüssel übernehmen!", 16, 256, 574, 17)
GUISetState(@SW_SHOW)
if guictrlread($edit1)<>"" Then GUICtrlSetData($edit2, _generatekey(guictrlread($edit1))) ;aus dem Edit1 einen Key generieren
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
case $Button
$text=guictrlread($edit1) ;text auslesen
$Key=guictrlread($edit2) ;schlüssel auslesen
GUICtrlSetData($edit1, _encrypt_decrypt($text,$key)) ;verschlüsseln/entschlüsseln
EndSwitch
WEnd
func _generatekey($text)
$key=""
for $i=1 to stringlen($text)
do
$zeichen=random(32,255,1) ;zufallszeichen
until $zeichen<>stringmid($text,$i,1) ;falls beide zeichen gleich sind, wird das ergebnis des XOR =0 und ist nicht darstellbar
$key &= chr($zeichen) ;Zeichen unterhalb 32 sind steuerzeichen und werden in EDIT/MSGBOX/CONSOLE nicht dargestellt
Next
return $key
endfunc
func _encrypt_decrypt($text,$key) ;text ver- bzw. entschlüsseln
$encrypt_decrypt=""
if guictrlread($edit2)="" Then ;falls edit2 leer, key generieren
GUICtrlSetData($edit2, _generatekey(guictrlread($edit1))) ;aus dem Edit1 einen Key generieren
endif
for $i=1 to stringlen($text) ;alle zeichen durchgehen
$encrypt_decrypt&=chr(BitXOR(asc(stringmid($text,$i,1)),asc(stringmid($key,$i,1))));XOR -Verknüpfung des textzeichens mit dem Keyzeichen
Next
return $encrypt_decrypt
endfunc
Man könnte den Schlüssel verkürzen, indem man ihn für die einzelnen Textabschnitte mehrfach benutzt. Das ist aber ein risiko, daher werden Verfahren zum Bit- oder Bytetauschen, Rotieren usw eingesetzt um die Schlüssellänge möglichst kurz zu halten.