Muss der Chiffrierte Text die selbe Länge haben wie der Originaltext?
Wenn der chiffrierte Text länger sein darf, könntest du beim Chriffrieren
Zufallsbytes und zusätzliche Prüfsummen einbauen, sodass du beim
Dechiffrieren immer ein paar Bytes ausprobieren musst, bis die Prüfsumme
übereinstimmt. Dafür muss die Prüfsumme natürlich eindeutig sein.
Hier mal mein Beispielcode:
Code: Alles auswählen
#Code_Min = -64 ;minimal -128
#Code_Max = 63 ;maximal 127
Procedure Encode(*mem, Size.l)
Protected *b.Byte = *mem
Protected *emem, *eb.Byte
Protected r.b = (Random(#Code_Max - #Code_Min) + #Code_Min)
Protected md5.s = MD5Fingerprint(*mem, Size)
If Size = 0 : ProcedureReturn #False : EndIf
*emem = AllocateMemory(Size + 32 + SizeOf(Long))
If Not *emem : ProcedureReturn #False : EndIf
*eb = *emem
PokeL(*eb, Size)
*eb + SizeOf(Long)
While Size
*eb\b = *b\b ! r
r = *b\b
*eb + 1
*b + 1
Size - 1
Wend
PokeS(*eb, md5, 32, #PB_Ascii)
ProcedureReturn *emem
EndProcedure
Procedure Decode(*mem)
Protected *b.Byte, Size.l = PeekL(*mem)
Protected *dmem, *db.Byte
Protected r.b = 0, c.l, rtmp.l
Protected md5.s = ""
*dmem = AllocateMemory(Size)
If Not *dmem : ProcedureReturn #False : EndIf
rtmp = #Code_Min
While rtmp <= #Code_Max And md5 <> PeekS(*mem + SizeOf(Long) + Size, 32, #PB_Ascii)
r = rtmp
*db = *dmem
*b = *mem + SizeOf(Long)
c = Size
While c
*db\b = *b\b ! r
r = *db\b
*db + 1
*b + 1
c - 1
Wend
md5 = MD5Fingerprint(*dmem, Size)
rtmp + 1
Wend
ProcedureReturn *dmem
EndProcedure
s.s = "Ich versuche jetzt mal einen etwas längeren Text zu schreiben, damit man die Zeiten auch noch gut messen kann. "
s + "Ob mir das aber gelingt, kann ich nicht genau sagen. Notfalls kann man sich ja einen anderen Text dazu nehmem. "
s + "Witzig finde ich aber, dass die Zeilen, die ich hier mal so frei dahin schreibe, immer genau gleich lang sind. "
s + "Das könnte man jetzt noch länger so weiter machen, aber irgendwie wird es langweilig und spät ist es außerdem. "
s + "Also höre ich mit dieser Zeile auf und versuche noch schnell die Zeitmessung zum Testen dazu zu programmieren."
Debug s
DisableDebugger
time = ElapsedMilliseconds()
For a = 1 To 100
If *cipher : FreeMemory(*cipher) : EndIf
*cipher = Encode(@s, Len(s))
Next
time = ElapsedMilliseconds() - time
EnableDebugger
Debug time
DisableDebugger
time = ElapsedMilliseconds()
For a = 1 To 100
If *decipher : FreeMemory(*decipher) : EndIf
*decipher = Decode(*cipher)
Next
time = ElapsedMilliseconds() - time
EnableDebugger
Debug time
Debug PeekS(*decipher)
Der Decoder kann bis zu 256 mal langsamer sein. Das kann man dann
genauer mit '#Code_Min' und '#Code_Max' einstellen. Die Differenz gibt
den maximalen Multiplikator der Encode-Dauer für die Decode-Dauer an.
Man könnte das ganze sicherlich auch ohne MD5 lösen, aber so war's
einfacher.
///Edit:
Mir fällt grad auf, dass ich deinen Key vergessen habe. Aber so siehst du
zumindest, dass man mittels 'Random()' die Ausführungsdauer natürlich
sehr leicht erhöhen kann. Im besten Fall, läuft 'Decode()' genau so lange
wie 'Encode()', im schlechtesten Fall braucht 'Decode()' (#Code_Max -
#Code_Min) mal so lange wie 'Encode()'.