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
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.
[b]Grenzen:[/b]
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!
[b]Fazit:[/b]
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]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[/code]