Seite 1 von 1

Erweiterte Vigenère-Verschlüsselung

Verfasst: 02.11.2005 20:11
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

Verfasst: 02.11.2005 21:15
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)

Verfasst: 02.11.2005 21:19
von hardfalcon
@vonTurnundTaxis: Fehler bei Zeile 21: "Can't allocate a memory block with a negative size!"

Verfasst: 03.11.2005 00:13
von vonTurnundTaxis
@NicTheQuick: Die Codes sind nahezu gleichschnell :mrgreen:
@hardfalcon: Dann hast du eine falsche Datei angegeben...