hier mal mein Ansatz zu einer einfachen, aber doch relativ (!) sicheren Verschlüsselung von Strings.
Hab ich für ein kleines Projekt gebraucht.
Vielleicht kann ja jemand was damit anfangen.
Fehler sind beabsichtigt und können gerne hier besprochen werden.
LG aus Köln
Idee kommt hierher:
https://de.wikipedia.org/wiki/Vigenère-Chiffre
Updated code:
Code: Alles auswählen
; Vigenere by WB
EnableExplicit ; the magic one !
; ----------------------------------------------------------------------------------
Enumeration
#VIGENERE_ENCODE = 0
#VIGENERE_DECODE
EndEnumeration
; ----------------------------------------------------------------------------------
Declare.s sVigenere(sMsg.s, sKey.s, iMode.i=#VIGENERE_ENCODE, bFlag.b=#False)
; ----------------------------------------------------------------------------------
; test
Global.s sMsgOriginal = "<The QUICK brown FoX jumps over a lazy dog. Still in 2022!>"
Global.s sPassword = "x$(XxHsBßv0hM$jß"
Global.s sResult1 = ""
Global.s sResult2 = ""
sResult1 = sVigenere(sMsgOriginal, sPassword, #VIGENERE_ENCODE, #False)
sResult2 = sVigenere(sResult1, sPassword, #VIGENERE_DECODE, #False)
Debug "Password: " + sPassword
Debug "Original String: " + sMsgOriginal
Debug "Verschlüsselt: " + sResult1
Debug "Entschlüsselt: " + sResult2
End
; ----------------------------------------------------------------------------------
; scramble and descramble any given string with the Vigenere algorythm (simplified)
; sMsg = string to scramble/descramble
; sKey = password phrase
; iMode = 0 -> Encode string
; iMode = 1 -> DeCode string
; bFlag = #true -> Use CRC32 checksum check
; bFlag = #false -> Do not Use CRC32 checksum check
; returns decoded or encoded string
; or "CRC32 Error" + string if the CRC32 check failed
; created: 2022-SEP-15 - WB
; last bits: 2022-SEP-28 - WB
; ----------------------------------------------------------------------------------
Procedure.s sVigenere(sMsg.s, sKey.s, iMode.i=#VIGENERE_ENCODE, bFlag.b=#False)
Protected.s sWorkString = sMsg ; copy of original string
Protected.s sCRC32 = ""
Protected.s sCurChar = "" ; current char to work on
Protected.s sCurKeyChar = "" ; current keybuffer char
Protected.s sDestChar = "" ; result of encode or decode
Protected.s sKeyBuffer = "" ; buffer for password string
Protected.s sResult = "" ; function return value
Protected.i iWorkLength = 0 ; length of string to de or encode
Protected.i iKeyLength = 0 ; length of password string
Protected.i iBaseLength = 0 ; length of base string
Protected.i iCount = 0 ; simple loop counter
Protected.i iCurrentPos = 0 ; current pos in msg string
Protected.i iPos1 = 0 ; reference position of current char inside msg
Protected.i iPos2 = 0 ; reference position of current key char
Protected.i iPos3 = 0 ; calculated reference position
If bFlag = #True
UseCRC32Fingerprint()
If iMode = #VIGENERE_DECODE
sCRC32 = Right(sWorkString, 8) ; get checksum from workstring
sWorkString = Left(sWorkString, Len(sWorkString)-8) ; strip checksum
Else
sCRC32 = StringFingerprint(sWorkString, #PB_Cipher_CRC32) ; create checksum
EndIf
EndIf
; ---------------------------------------------------------------------
; 000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999
; 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
Protected.s sCharReference = "€abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 !§$%&/()=?öüÄÖÜß<>[]{}|,;.:-_#'+*ä@" +
Chr(34)
; ---------------------------------------------------------------------
iWorkLength = Len(sWorkString)
iKeyLength = Len(sKey)
iBaseLength = Len(sCharReference)
If iWorkLength = 0
ProcedureReturn "" ; Exit wenn string leer ist
EndIf
; Buffer string generieren ----------------------------------------
; Beispiel:
; string to de/encode "Das ist ein TestText!"
; sKeyBuffer "PasswordPasswordPassw"
sKeyBuffer = ""
For iCount = 0 To iWorkLength-1 ; schleife über gesamte stringlänge
sKeyBuffer + Mid(sKey, 1+Mod(iCount, iKeyLength), 1) ; keybuffer generieren mit Modulo aus keystring
Next iCount ; loop
; -----------------------------------------------------------------
iCurrentPos = 1 ; sicherstellen, das mit dem ersten Zeichen im String angefangen wird!
For iCount = 1 To iWorkLength ; Schleife über die gesamte stringlänge
sCurChar = Mid(sWorkString, iCurrentPos, 1) ; aktuellen workchar aus string separieren
iPos1 = FindString(sCharReference, sCurChar) ; position im reference string holen
If iPos1 = 0 ; Wenn 0 dann wurde dieser Char nicht gefunden
iPos1 = 1 ; in diesem Fall auf das erste Zeichen im reference string setzen!
Debug "sVigenere: Illegal char found: " + sCurChar + " at pos: " + Str(iCurrentPos) ; debug meldung ausgeben
EndIf
sCurKeyChar = Mid(sKeyBuffer, iCurrentPos, 1) ; aktuellen keybuffer char holen
iPos2 = FindString(sCharReference, sCurKeyChar) ; position im reference string holen (keine Abfrage auf gültigkeit hier)
Select iMode
Case #VIGENERE_ENCODE ; ENCODE:
iPos3 = 1 + Mod((iPos1+iPos2), iBaseLength) ; Beide Werte addieren und per modulo neue position im reference string berechnen
Case #VIGENERE_DECODE ; DECODE:
iPos3 = (iPos1-iPos2) - 1 ; Beide Werte voneinander abziehen
If (iPos3 < 1) ; wenn >1, länge des reference strings aufaddieren
iPos3 + iBaseLength
EndIf
EndSelect
sDestChar = Mid(sCharReference, iPos3, 1) ; neuen char aus reference string holen
sResult + sDestChar ; string bauen
iCurrentPos + 1 ; positionszeiger erhöhen
Next ; loop
Select bFlag
Case #True
Select iMode
Case #VIGENERE_ENCODE
sResult + sCRC32
Case #VIGENERE_DECODE
If StringFingerprint(sResult, #PB_Cipher_CRC32) <> sCRC32
sResult = "CRC32 failed: " + sResult
Debug "CRC32: Failed!"
EndIf
EndSelect
EndSelect
sKeyBuffer = "" ; löschen alter keybuffer
ProcedureReturn sResult ; Rückgabe des Ergebnisses
EndProcedure