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.
R3booz
Beiträge: 90 Registriert: 01.11.2012 19:28
Computerausstattung: Intel Core I3, 4GB RAM, RADEON HD 6660 1 GDDR5
Kontaktdaten:
Beitrag
von R3booz » 20.02.2014 22:51
Habe da grade mal was lustiges geschrieben bin zufällig auf die Wiki Seite gestossen und habs mal umgesetzt
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
mfg R3booz
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
Beitrag
von NicTheQuick » 21.02.2014 00:16
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.