One-Time-Pad Verschlüsselung

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
R3booz
Beiträge: 90
Registriert: 01.11.2012 19:28
Computerausstattung: Intel Core I3, 4GB RAM, RADEON HD 6660 1 GDDR5
Kontaktdaten:

One-Time-Pad Verschlüsselung

Beitrag von R3booz »

Habe da grade mal was lustiges geschrieben bin zufällig auf die Wiki Seite gestossen und habs mal umgesetzt :mrgreen:
http://de.wikipedia.org/wiki/One-Time-Pad

Eine einfache Verschlüsselungsmethode, der Key muss genauso lang wie das zu verschlüsselnde sein.

Hier der Quellcode für die Funktionen:

Code: Alles auswählen

Procedure.s SK_Enc_OneTimePad(in.s,key.s)
  If Len(in.s) > Len(key.s)
    ProcedureReturn ""
  EndIf
  For i=1 To Len(in.s)
    eins.s=Mid(in.s,i,1)
    zwei.s=Mid(key.s,i,1)
    weins = Asc(eins.s)
    wzwei = Asc(zwei.s)
    If weins+wzwei > 255
      gesamt = (weins+wzwei)-256
    Else
      gesamt = (weins+wzwei)
    EndIf
    new.s + Chr(gesamt)
  Next
  ProcedureReturn new.s
EndProcedure

Procedure.s SK_Dec_OneTimePad(in.s,key.s)
  If Len(in.s) > Len(key.s)
    ProcedureReturn ""
  EndIf
  For i=1 To Len(in.s)
    eins.s=Mid(in.s,i,1)
    zwei.s=Mid(key.s,i,1)
    weins = Asc(eins)
    wzwei = Asc(zwei)
    If weins-wzwei < 255
      gesamt = (weins-wzwei)+256
    Else
      gesamt = (weins-wzwei)
    EndIf
    new.s + Chr(gesamt)
  Next
  ProcedureReturn new.s
EndProcedure

Procedure.s SK_Enc_OneTimePadKey(in.s)
  For i=0 To Len(in.s)
    key.s + Chr(Random(255,0))
  Next
  ProcedureReturn key.s
EndProcedure
Test:

Code: Alles auswählen

Debug SK_Enc_OneTimePad("Test","hsze")
Debug SK_Dec_OneTimePad(SK_Enc_OneTimePad("Test","rofl"),"hsze")
Viel Spass damit :lol:

mfg R3booz
Rechtschreibfehler sind kostenlos und im Preis inklusive!

http://www.games-table.de.tl/
Version 5.20 LTS
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: One-Time-Pad Verschlüsselung

Beitrag von NicTheQuick »

Sowas hatte ich auch mal gebastelt.

Code: Alles auswählen

Procedure OTP_EncDec(*data.Character, *key.Character)
	Protected *k.Character = *key
	
	While *data\c
		*data\c ! *k\c
		*data + SizeOf(Character)
		If (*k\c = 0)
			*k = *key
		Else
			*k + SizeOf(Character)
		EndIf		
	Wend
EndProcedure

Procedure.s String2Hex(*string.Character)
	Protected result.s
	
	While *string\c
		result + RSet(Hex(*string\c), SizeOf(Character) * 2, "0")
		*string + SizeOf(Character)
	Wend
	
	ProcedureReturn result
EndProcedure

Define input.s = "Hallo"
Define key.s = "12.d#"

Define *memInput = AllocateMemory(SizeOf(Character) * (Len(input) + 1))
CopyMemory(@input, *memInput, MemorySize(*memInput))

Debug "Original: " + String2Hex(@input)

OTP_EncDec(*memInput, @key)

Debug "Verschlüsselt: " + String2Hex(*memInput)

OTP_EncDec(*memInput, @key)

Debug "Entschlüsselt: " + String2Hex(*memInput)

Define key2.s = "12ld#"

OTP_EncDec(*memInput, @key2)

Debug "Verschlüsselt: " + String2Hex(*memInput) + " (Nur noch 2 Zeichen wegen Nullbyte an dritter Stelle!)"
Bei dir ist allerdings noch ein kleiner Fehler drin. Man kann nämlich keine Nullbytes in Strings verwenden. Diese können nach der Verschlüsselung aber durchaus vorkommen. Zum Beispiel dann, wenn der Schlüssel an einer Stelle den selben Buchstaben enthält wie der zu verschlüsselnde String. Das siehst du auch in meinem Code als Beispiel.
Antworten