Erweiterte Vigenère-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
vonTurnundTaxis
Beiträge: 2130
Registriert: 06.10.2004 20:38
Wohnort: Bayreuth
Kontaktdaten:

Erweiterte Vigenère-Verschlüsselung

Beitrag von vonTurnundTaxis »

Ich habe eine erweiterte Version des Vigenère-Verschlüsselungs-Algorithmus in PureBasic geschrieben.
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
Nicht durch Zorn, sondern durch Lachen tötet man
ClipGrab | Pastor - jetzt mit kurzen URLs!
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
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 »

Hab's mal neu programmiert, weil's mich nochmal an meine QuickBasic-
Zeit erinnert hat, wo ich dieses Verfahren quasi selbst nochmal erfunden
hab. Damals hatte ich noch kein Internet und war total stolz drauf, sowas
erfunden zu haben. :lol:

Aber ich finde meine Version etwas übersichtlicher, außerdem braucht es
keine langsame LinkedList.

Code: Alles auswählen

Procedure.l VigenereCrypt(QuellDatei.s, Schluessel.s, Zieldatei.s, Modus.l)
  Protected *FileMem, FileID.l, FileLength.l, a.l, *Key.BYTE, *FilePos.BYTE
  
  FileID = ReadFile(#PB_Any, QuellDatei)
  If FileID
    FileLength = Lof()
    *FileMem = AllocateMemory(FileLength)
    If *FileMem
      ReadData(*FileMem, FileLength)
      CloseFile(FileID)
      a = FileLength
      *Key = @Schluessel
      *FilePos = *FileMem
      If Modus = 0
        While a
          If *Key\b = 0 : *Key = @Schluessel : EndIf
          *FilePos\b + *Key\b
          
          *FilePos + 1 : *Key + 1 : a - 1
        Wend
      Else
        While a
          If *Key\b = 0 : *Key = @Schluessel : EndIf
          *FilePos\b - *Key\b
          
          *FilePos + 1 : *Key + 1 : a - 1
        Wend
      EndIf
      
      FileID = CreateFile(#PB_Any, Zieldatei)
      If FileID
        WriteData(*FileMem, FileLength)
        CloseFile(FileID)
        ProcedureReturn #True
      Else
        FreeMemory(*FileMem)
        ProcedureReturn #False
      EndIf
      
      FreeMemory(*FileMem)
    Else
      ;Konnte Speicher nicht allokieren
      CloseFile(FileID)
      ProcedureReturn #False
    EndIf
  Else
    ;Konnte Datei nicht öffnen
    ProcedureReturn #False
  EndIf
EndProcedure

VigenereCrypt("f:\anime2.gif", "Feel the Pure Power!", "f:\anime3.gif", 0)
VigenereCrypt("f:\anime3.gif", "Feel the Pure Power!", "f:\anime4.gif", 1)
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

@vonTurnundTaxis: Fehler bei Zeile 21: "Can't allocate a memory block with a negative size!"
Benutzeravatar
vonTurnundTaxis
Beiträge: 2130
Registriert: 06.10.2004 20:38
Wohnort: Bayreuth
Kontaktdaten:

Beitrag von vonTurnundTaxis »

@NicTheQuick: Die Codes sind nahezu gleichschnell :mrgreen:
@hardfalcon: Dann hast du eine falsche Datei angegeben...
Nicht durch Zorn, sondern durch Lachen tötet man
ClipGrab | Pastor - jetzt mit kurzen URLs!
Antworten