[Gelöst!!] RC4-Verschlüsselung mit BASIC

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: [Gelöst!!] RC4-Verschlüsselung mit BASIC

Re: [Gelöst!!] RC4-Verschlüsselung mit BASIC

von Stephan » Fr, 30.09.2011 22:14

Ich selbst suche jedenfalls schon seit Ewigkeiten vergeblich nach einer entsprechenden Funktion für OpenOffice
OOo nutzt den blowfish-Algorithmus zum Verschlüsseln von Dateien und Makros, dieser steht prinzipiell auch für beliebige Verschlüsselungen zur Verfügung.
Ich habe da weiter keine Erfahrung da ich das Ganze bisher nur nutze um kleinere Informationen sicher in verschlüsselten Dokumentmakros abzulegen, da aber eine Verschlüsselung von Dokumenten keine besonderen Schwierigkeiten aufwirft, würde ich, falls Geschwindigkeit gefragt ist dieses Verfahren zumindest erwägen wenn es um größere Textmengen geht.



Gruß
Stephan

[Gelöst!!] RC4-Verschlüsselung mit BASIC

von ejomi » Fr, 30.09.2011 18:05

Hallo und Guten Tag Zusammen!

Vielleicht hilft ja dem Einen oder Anderen mein nachfolgend vorgestellter Verschlüsselungs-Algo.
Ich selbst suche jedenfalls schon seit Ewigkeiten vergeblich nach einer entsprechenden Funktion für OpenOffice und habe jetzt kurzerhand die RC4-Implementierung von AutoIt© in STAR-BASIC umgesetzt. Die Funktion "passt auf sich selbst auf", d.h. eine Überschreitung gewisser Maximal-Werte wird verhindert und es wird eine eindeutige Fehlermeldung ausgegeben.

Grenzen:
Der RC4-Algorithmus ver-/entschlüsselt nur ANSII/ASCII, d.h. Unicode-Texte und Kennwörter sind hier absolut unbrauchbar!!
Praktikabel ist die Funktion bei einer Handvoll Zeichen (z.B. bei schutzwürdigen Kennwörtern oder sonstigen Steuer- oder Loginparametern) wobei die Rechenzeit kaum wahrnehmbar und auch der produzierte HEX-Code handelbar bleibt.
Bei kleineren Texten bis ca. 1000 Zeichen ist die Verschlüsselungszeit von ca. 1-2 Sek. mit einem HEX-Code von ca. 4000 Zeichen noch erträglich.
Maximal verschluesselbar sind ca. 8000 Zeichen (ca. 2 A4-Seiten). Diese können dann aber durchaus (abhängig von der Rechner-Leistung) ihre 6-7 Sek. Ver-/Entschlüsselungszeit beanspruchen, wobei aber der HEX-Code die magische 16Bit-Grenze (32768 Zeichen) erreicht!!
Richtig problematisch und deshalb bei größeren Textmengen nicht zu empfehlen ist der optionale Verschlüsselungs-Level, der standardmäßig auf "1" steht. Wird dieser Level verändert, erhöht sich die Rechenzeit und vorallem der produzierte HEX-Code exponential!
Zum Beispiel kann die Verschlüsselung eines einfachen Passwortes bei Level "5" ganz locker die gleiche Zeit beanspruchen, wie die Verschlüsselung einer A4-Seite mit Level "1" - klingt komisch, ist aber so!

Fazit:
Mit Level 1 und einem differenzierten Verschlüsselungs-Kennwort liefert die Funktion eine sehr gute Verschlüsselung bei akzeptablem Rechenaufwand.

Und nun: Viel Spaß damit (Verbesserungsvorschläge erwünscht)
und viele Grüße aus Dresden von "ejomi"

Code: Alles auswählen

FUNCTION CryptString$(iSwitch%, sText$, sPasswd$, OPTIONAL iLevel%)
'
' Description:
'    RC4 based string encryption (ASCII/ANSI)
'    taken from the "AutoIt"-Library, (c) Jonathan Bennett
'    http://www.autoitscript.com/
' Origin Author:
'    Wes Wolfe-Wolvereness
' STAR-BASIC adaptation:
'    EJOMI, Dresden
'
' Note:
'    Unicodes (Multibyte characters) are  N O T  supported!
'
' W A R N I N G :
'    This function can have an extreme timespan if the
'    encryption level or encrypted string are too large!
'
' Parameters:
'    iSwitch  ->  1 = encrypt, 2 = decrypt
'    sText    ->  string to encrypt
'    sPasswd  ->  encryption password
'    iLevel   ->  encryption level (number of times to encrypt)
'
' Return Values:
'    On success -> returns the string en-/decrypted
'    On failure -> returns a message-string beginning with "## ERROR: ..."
'

ON ERROR GOTO CryptErr

DIM iCntA%,iCntB%,iCntC%,iCntD%,iCntE%,iCntF%,iCntG%,iCntH%,iAscV%,iKeyS%,sCphr$,sMdfd$,aSBox%(256,2)

IF IsMissing(iLevel)THEN iLevel=1
IF CINT(iLevel)<1 Or CINT(iLevel)<>iLevel THEN iLevel=1

' --- Input check: ---
IF iSwitch<1 OR iSwitch>2THEN
	iSwitch=0
	sText = "## ERROR: faulty switch! ##"
ELSE
	IF sText="" OR sPasswd=""THEN
		iSwitch=0
		BEEP
		sText = "## ERROR: password or content missing! ##"
	ELSE
		IF iSwitch=1AND LEN(sText)>8190 THEN
			iSwitch=0
			BEEP
			sText = "## ERROR: content too big (max. 8190 char's)! ##"
		ELSE
			FOR iCntA=1 TO LEN(sPasswd)
				IF ASC(MID(sPasswd,iCntA,1))>255THEN
					iSwitch=0
					BEEP
					sText = "## ERROR: password with special char's (non ANSI)! ##"
					EXIT FOR
				ENDIF
			NEXT
		ENDIF
	ENDIF
ENDIF

IF iSwitch=1THEN
	' --- Encryption: ---
	FOR iCntF=0 TO iLevel
		iCntB=0:iCntC=0:iCntD=0:iCntH=0:sMdfd="":sCphr=""
		FOR iCntG=1 TO LEN(sText)
			IF iCntH=LEN(sPasswd)THEN
				iCntH=1
			ELSE
				iCntH=iCntH+1
			ENDIF
			sMdfd=sMdfd+CHR((ASC(MID(sText,iCntG,1))XOR ASC(MID(sPasswd,iCntH,1)))XOR 255)
		NEXT
		sText=sMdfd
		REDIM aSBox(256,2)
		FOR iCntA=0 TO 255
			aSBox(iCntA,1)=ASC(MID(sPasswd,(iCntA MOD LEN(sPasswd))+1,1))
			aSBox(iCntA,0)=iCntA
		NEXT
		FOR iCntA=0 TO 255
			iCntB=(iCntB+aSBox(iCntA,0)+aSBox(iCntA,1))MOD 256
			iKeyS=aSBox(iCntA,0)
			aSBox(iCntA,0)=aSBox(iCntB,0)
			aSBox(iCntB,0)=iKeyS
		NEXT
		FOR iCntA=1 TO LEN(sText)
			iCntC=(iCntC+1)MOD 256
			iCntD=(iCntD+aSBox(iCntC,0))MOD 256
			iCntE=aSBox((aSBox(iCntC,0)+aSBox(iCntD,0))MOD 256,0)
			iAscV=ASC(MID(sText,iCntA,1))XOR iCntE
			sCphr=sCphr+RIGHT("0"+HEX(iAscV),2)
		NEXT
		sText=sCphr
	NEXT
ELSEIF iSwitch=2THEN
	' --- Decryption: ---
	FOR iCntF=0 TO iLevel
		iCntB=0:iCntC=0:iCntD=0:iCntH=0:sMdfd="":sCphr=""
		REDIM aSBox(256,2)
		FOR iCntA=0 TO 255
			aSBox(iCntA,1)=ASC(MID(sPasswd,(iCntA MOD LEN(sPasswd))+1,1))
			aSBox(iCntA,0)=iCntA
		NEXT
		FOR iCntA=0 TO 255
			iCntB=(iCntB+aSBox(iCntA,0)+aSBox(iCntA,1))MOD 256
			iKeyS=aSBox(iCntA,0)
			aSBox(iCntA,0)=aSBox(iCntB,0)
			aSBox(iCntB,0)=iKeyS
		NEXT
		FOR iCntA=1 TO LEN(sText)STEP 2
			iCntC=(iCntC+1)MOD 256
			iCntD=(iCntD+aSBox(iCntC,0))MOD 256
			iCntE=aSBox((aSBox(iCntC,0)+aSBox(iCntD,0))MOD 256,0)
			iAscV=CINT("&H"+MID(sText,iCntA,2))XOR iCntE
			sCphr=sCphr+CHR(iAscV)
		NEXT
		sText=sCphr
		FOR iCntG=1 TO LEN(sText)
			IF iCntH=LEN(sPasswd)THEN
				iCntH=1
			ELSE
				iCntH=iCntH+1
			ENDIF
			sMdfd=sMdfd+CHR(ASC(MID(sText,iCntG,1))XOR ASC(MID(sPasswd,iCntH,1))XOR 255)
		NEXT
		sText=sMdfd
	NEXT
ENDIF

If LEN(sText)>32767 THEN
	sText = "## ERROR: content too big or too much crypt-levels! ##"
	BEEP
EndIf
' --- Output: ---
CryptString = sText
ON ERROR GOTO 0
EXIT FUNCTION
CryptErr:
' --- ERROR: ---
CryptString = "## ERROR: encryption error (perhaps UTF-content?) ##"
BEEP
ON ERROR GOTO 0
END FUNCTION

Nach oben