Seite 1 von 1

One-Time-Pad Verschlüsselung

Verfasst: 20.02.2014 22:51
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

Re: One-Time-Pad Verschlüsselung

Verfasst: 21.02.2014 00:16
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.