Erweiterte Vigenère-Verschlüsselung
Verfasst: 02.11.2005 20:11
Ich habe eine erweiterte Version des Vigenère-Verschlüsselungs-Algorithmus in PureBasic geschrieben.
Vielleicht kann es jemand gebrauchen:
Vielleicht kann es jemand gebrauchen:
Code: Alles auswählen
NewList Vigenere_Schluessel.b()
Procedure.s VigenereCrypt(Datei$, Schluessel$, Zieldatei$, Modus.b);ver/entschlüsselt eine Datei
Protected Datei$, Schluessel$, Zieldatei$, Modus, zaehl, Speicherbereichsgroesse, *Speicherbereich, tmp.b, tmpDatei
ClearList(Vigenere_Schluessel.b())
Speicherbereichsgroesse = FileSize(Datei$)
;-----------------------
Debug "---Zerlege Schlüssel in seine ASCII-Werte---"
;-----------------------
While zaehl < Len(Schluessel$)
zaehl + 1
AddElement(Vigenere_Schluessel())
Vigenere_Schluessel() = Asc(Mid(Schluessel$, zaehl, 1))
Wend
;-----------------------
Debug "---Lese Bytes der Quelldatei in Speicher ein---"
;-----------------------
tmpDatei = ReadFile(#PB_Any, Datei$)
*Speicherbereich = AllocateMemory(Speicherbereichsgroesse)
ReadData(*Speicherbereich, Speicherbereichsgroesse)
CloseFile(tmpDatei)
;-----------------------
Debug "---Verrechne Schlüssel mit Bytes der Quelldatei (direkt im Speicher)---"
;-----------------------
zaehl = -1
If Modus = 0; Verschlüsseln
While zaehl < Speicherbereichsgroesse
zaehl + 1
ForEach Vigenere_Schluessel()
tmp.b = PeekB(*Speicherbereich + zaehl) + Vigenere_Schluessel()
If tmp > 127
tmp - 256
EndIf
PokeB(*Speicherbereich + zaehl, tmp)
Next
Wend
Else; Entschlüsseln
While zaehl < Speicherbereichsgroesse
zaehl + 1
ForEach Vigenere_Schluessel()
tmp.b = PeekB(*Speicherbereich + zaehl) - Vigenere_Schluessel()
If tmp < -127
tmp + 256
EndIf
PokeB(*Speicherbereich + zaehl, tmp)
Next
Wend
EndIf
;-----------------------
Debug "---Schreibe Ver/Entschlüsselte Bytes aus dem Speicher in die Zieldatei---"
;-----------------------
tmpDatei = CreateFile(#PB_Any, Zieldatei$)
WriteData(*Speicherbereich, Speicherbereichsgroesse)
CloseFile(tmpDatei)
FreeMemory(*Speicherbereich)
EndProcedure
;-----------------------
;Beispielprogramm
;-----------------------
Start = ElapsedMilliseconds()
Datei$ = "test.txt"
Schluessel$ = "Ein Schlüssel mit Groß- und Kleinschreibung"
VigenereCrypt(Datei$, Schluessel$, GetPathPart(Datei$) + GetPathPart(Datei$) + Left(GetFilePart(Datei$), Len(Datei$) - Len(GetExtensionPart(Datei$))-1) + ".vig", 0)
VigenereCrypt(GetPathPart(Datei$) + GetPathPart(Datei$) + Left(GetFilePart(Datei$), Len(Datei$) - Len(GetExtensionPart(Datei$))-1) + ".vig", Schluessel$, GetPathPart(Datei$) + Left(GetFilePart(Datei$), Len(Datei$) - Len(GetExtensionPart(Datei$))-1) + "2." + GetExtensionPart(Datei$), 1)
Debug ""
Debug "Es wurden " + Str(ElapsedMilliseconds() - Start) + " Millisekunden zum Ver- und Entschlüssen benötigt"
Debug ""
If MD5FileFingerprint(Datei$) = MD5FileFingerprint(GetPathPart(Datei$) + Left(GetFilePart(Datei$), Len(Datei$) - Len(GetExtensionPart(Datei$))-1) + "2." + GetExtensionPart(Datei$))
Debug "Die MD5-Fingerprints der originalen und der wieder entschlüsselten Datei sind gleich:"
Debug MD5FileFingerprint(Datei$)
Else
Debug "Die MD5-Fingerprints der originalen und der wieder entschlüsselten Datei unterscheiden sich!"
Debug "Vermutlich wurde als Quelle eine Datei mit binären Inhalten verwendet."
EndIf