Vigenere Verschlüsselung von Strings - Mein Ansatz

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
PureUser1966
Beiträge: 29
Registriert: 02.02.2017 21:03
Wohnort: Cologne / Germany

Vigenere Verschlüsselung von Strings - Mein Ansatz

Beitrag von PureUser1966 »

Hallo allerseits,
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




Zuletzt geändert von PureUser1966 am 28.09.2022 19:17, insgesamt 1-mal geändert.
move.w #$7fff, $dff09a
ILLEGAL
Benutzeravatar
PureUser1966
Beiträge: 29
Registriert: 02.02.2017 21:03
Wohnort: Cologne / Germany

Re: Vigenere Verschlüsselung von Strings - Mein Ansatz

Beitrag von PureUser1966 »

Kleinen Fehler behoben...
Zuletzt geändert von PureUser1966 am 28.09.2022 19:18, insgesamt 1-mal geändert.
move.w #$7fff, $dff09a
ILLEGAL
Blitzer
Beiträge: 79
Registriert: 26.09.2004 14:33
Wohnort: Lower Saxony

Re: Vigenere Verschlüsselung von Strings - Mein Ansatz

Beitrag von Blitzer »

Ich kann damit was anfangen, danke.
Ist sogar besser als das Quadrat aus dem 16. Jahrhundert, da auch Kleinbuchstaben verarbeitet werden.

Blitzer
(Ich wünsche jeden der mich kennt, 10 x soviel wie er mir gönnt)
Benutzeravatar
dige
Beiträge: 1182
Registriert: 08.09.2004 08:53

Re: Vigenere Verschlüsselung von Strings - Mein Ansatz

Beitrag von dige »

Danke PureUser1966, dass könnte ich gut für ein Web (Server/Client) Projekt gebrauchen.
"Papa, mein Wecker funktioniert nicht! Der weckert immer zu früh."
Benutzeravatar
PureUser1966
Beiträge: 29
Registriert: 02.02.2017 21:03
Wohnort: Cologne / Germany

Re: Vigenere Verschlüsselung von Strings - Mein Ansatz

Beitrag von PureUser1966 »

Ich kann damit was anfangen, danke.
Ist sogar besser als das Quadrat aus dem 16. Jahrhundert, da auch Kleinbuchstaben verarbeitet werden.
Blitzer
dige hat geschrieben: 26.09.2022 08:48 Danke PureUser1966, dass könnte ich gut für ein Web (Server/Client) Projekt gebrauchen.
Gerne, find ich toll das es jemand gebrauchen kann.

In deinem Fall würde ich allerdings zusätzlich empfehlen zB mit StringFingerprint(..) eine CRC32 Checksumme beim verschlüsseln hinten an den
String dranhängen, und nach dem entschlüsseln auf Plausibilität zu testen. So hab ich es im Endeffekt dann auch gemacht.
Bisher auch ohne Fehler, aber man weiß ja nie ;-)

LG
move.w #$7fff, $dff09a
ILLEGAL
Benutzeravatar
PureUser1966
Beiträge: 29
Registriert: 02.02.2017 21:03
Wohnort: Cologne / Germany

Re: Vigenere Verschlüsselung von Strings - Mein Ansatz

Beitrag von PureUser1966 »

Ich habe eine neue Version gebastelt, die nun wenn verlangt auch eine CRC32 Überprüfung beinhaltet.
Das kann über einen zusätzlichen Parameter (Siehe Prozedur) eingeschaltet werden.
In diesem Fall wird die beim verschlüsseln generierte CRC32 Checksumme rechts angehängt und beim entschlüsseln
zur Prüfung ausgelesen.

LG

Ausgabe des Testprojekts:

Code: Alles auswählen

>> OHNE CRC32
Password:        x$(XxHsBßv0hM$jß
Original String: <The QUICK brown FoX jumps over a lazy dog. Still in 2022!>
Verschlüsselt:   fn<5.ß&§j9Al7]I+.€,b.TPQäQAy ?DRAE{1Z9{H*E1?|;u#LE>$.:]{I;S
Entschlüsselt:   <The QUICK brown FoX jumps over a lazy dog. Still in 2022!>

>> MIT CRC32
Password:        x$(XxHsBßv0hM$jß
Original String: <The QUICK brown FoX jumps over a lazy dog. Still in 2022!>
Verschlüsselt:   fn<5.ß&§j9Al7]I+.€,b.TPQäQAy ?DRAE{1Z9{H*E1?|;u#LE>$.:]{I;S7a1ac338  <-- CRC32 Checksumme
Entschlüsselt:   <The QUICK brown FoX jumps over a lazy dog. Still in 2022!>

Zuletzt geändert von PureUser1966 am 28.09.2022 19:17, insgesamt 1-mal geändert.
move.w #$7fff, $dff09a
ILLEGAL
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Vigenere Verschlüsselung von Strings - Mein Ansatz

Beitrag von HeX0R »

<OT>
Üblicherweise versucht man den Code im ersten Beitrag aktuell zu halten (ihn also zu editieren).
Weil so wird es schwierig den Überblick zu behalten, gerade wenn solche Threads dann anwachsen.
</OT>
Benutzeravatar
PureUser1966
Beiträge: 29
Registriert: 02.02.2017 21:03
Wohnort: Cologne / Germany

Re: Vigenere Verschlüsselung von Strings - Mein Ansatz

Beitrag von PureUser1966 »

HeX0R hat geschrieben: 28.09.2022 18:54 <OT>
Üblicherweise versucht man den Code im ersten Beitrag aktuell zu halten (ihn also zu editieren).
Weil so wird es schwierig den Überblick zu behalten, gerade wenn solche Threads dann anwachsen.
</OT>
Alles klar, wird erledigt... Mea culpa
move.w #$7fff, $dff09a
ILLEGAL
Antworten