abbrechen
Goto Top

Cmd - Textverschlüsselung durch eigenes Alphabet

Hi,

ich würde gerne einen Fließtext via cmd verschlüsseln können und stelle mir die Struktur wiefolgt vor:

alphabet.endung
--> Inhalt: a = &%n<
b = )?""§
usw.

Verschlüsselungsdatei.bat
Diese Datei erkennt den Text, verwendet die alphabet.endung und wandelt ihn in einen verschlüsselten Text um.

text.txt
Der zu verschlüsselnde Text

new.txt
der verschlüsselte Text


Nun habe ich grundliegende Probleme bei diesem Projekt.
Zum Einen finde ich keinen Befehl, um den Inhalt einer Datei zu erkennen und zum anderen keinen Befehl um diesen Inhalt auf den Inhalt einer anderen Datei einzusetzen, sprich dass der Text vom Alphabet verschlüsselt wird.
Alternative Sprachen wären bei mir keine Lösung, da ich außer wenigen Websprachen nur in cmd halbwegs bewand bin.

Content-ID: 178294

Url: https://administrator.de/contentid/178294

Ausgedruckt am: 26.11.2024 um 05:11 Uhr

Friemler
Friemler 03.01.2012 um 12:03:13 Uhr
Goto Top
Hallo abbrechen,

leider ist die CMD-Batchsprache nur schlecht zum verarbeiten des Inhalts von Textdateien geeignet. Das fängt mit der Zeichencodierung an (CMD arbeitet mit der DOS-Codepage 850, normale Windowsprogramme/-editoren mit der ANSI-Codepage) und hört mit den Schwierigkeiten beim Verarbeiten von Zeichen auf, die zum Sprachumfang von Batchscript gehören (z.B. %,&,<,> usw.).

Deshalb eine VBScript-Lösung von mir:
'Name der Datei mit dem Codierungsalphabet  
strStdAlphabetFile = "Alphabet.txt"  


'Konstanten für File-I/O  
Const ForReading = 1
Const ForWriting = 2


'Wurden Parameter übergeben?  
If WScript.Arguments.Count > 0 Then
  'FileSystemObject erzeugen  
  Set objFSO = CreateObject("Scripting.FileSystemObject")  

  'Name der zu verschlüsselnden Datei aus dem ersten Element der Parameterliste lesen  
  'und ihren vollständigen Pfad ermitteln  
  strInFile  = objFSO.GetAbsolutePathName(WScript.Arguments(0))

  'Existiert die Eingabedatei?  
  If objFSO.FileExists(strInFile) Then
    'Wenn zwei Parameter übergeben wurden, Name der Datei mit dem Codierungsalphabet  
    'aus dem zweiten Element der Parameterliste lesen, sonst auf den Standardwert setzen  
    If WScript.Arguments.Count > 1 Then
      strAlphabetFile = WScript.Arguments(1)
    Else
      strAlphabetFile = strStdAlphabetFile
    End If

    'Vollständigen Pfad der Alphabetdatei ermitteln  
    strAlphabetFile = objFSO.GetAbsolutePathName(strAlphabetFile)

    'Existiert die Datei mit dem Codierungsalphabet?  
    If objFSO.FileExists(strAlphabetFile) Then
      'Objekt für reguläre Ausdrücke erzeugen  
      Set objRegExp     = New RegExp
      'Nur das erste Auftreten des Suchmusters finden  
      objRegExp.Global  = False
      'Suchmuster setzen  
      objRegExp.Pattern = "^(.{1})=(.{1,})$"  

      'Dictionary-Objekt erzeugen  
      Set objDictionary         = CreateObject("Scripting.Dictionary")  
      'Groß-/Kleinschreibung unterscheiden  
      objDictionary.CompareMode = 0

      'Alphabetdatei zum Lesen öffnen  
      Set objAlphabetFile = objFSO.OpenTextFile(strAlphabetFile, ForReading)

      'Alphabetdatei bis zum Ende einlesen  
      While Not objAlphabetFile.AtEndOfStream
        'Eine Zeile einlesen  
        strLine = objAlphabetFile.ReadLine

        'Die Zeile in ihre Bestandteile zerlegen  
        Set colMatches = objRegExp.Execute(strLine)

        'Schlüssel und Wert in das Dictionary eintragen  
        objDictionary.Add colMatches(0).SubMatches(0), colMatches(0).SubMatches(1)
      Wend

      'Alphabetdatei schließen  
      objAlphabetFile.Close

      'Objekt erzeugen, das die zu verschlüsselnde Datei referenziert  
      Set objInFile = objFSO.GetFile(strInFile)

      'Aus Pfad und Name der Eingabedatei Pfad und Name der Ausgabedatei erzeugen  
      'Aus "Test.txt" wird "Test_Codiert.txt"  
      strOutFile = objFSO.BuildPath(objFSO.GetParentFolderName(objInFile.Path), objFSO.GetBaseName(objInFile.Name) _
                                                                                & "_Codiert." _  
                                                                                & objFSO.GetExtensionName(objInFile.Name) _
                                   )

      'Eingabedatei zum Lesen öffnen  
      Set objInStream  = objInFile.OpenAsTextStream(ForReading)

      'Ausgabedatei zum Schreiben öffnen  
      Set objOutStream = objFSO.OpenTextFile(strOutFile, ForWriting, True)

      'Eingabedatei bis zum Ende einlesen  
      While Not objInStream.AtEndOfStream
        'Eine Zeile lesen  
        strLine = objInStream.ReadLine

        'Jedes Zeichen der Zeile verarbeiten  
        For I = 1 To Len(strLine)
          'Ein Zeichen aus der aktuellen Zeile extrahieren  
          strChar = Mid(strLine, I, 1)

          'Existiert für das aktuelle Zeichen eine Codierungsregel?  
          If objDictionary.Exists(strChar) Then
            'Das codierte Zeichen in die Ausgabedatei schreiben  
            objOutStream.Write objDictionary.Item(strChar)
          Else 'Keine Codierungsregel gefunden  
            'Das Zeichen uncodiert in die Ausgabedatei schreiben  
            objOutStream.Write strChar & strChar
          End If
        Next

        'Zeilenumbruch in die Ausgabedatei schreiben  
        objOutStream.Write vbCrLf
      Wend

      'Aus- und Eingabedatei schließen  
      objOutStream.Close
      objInStream.Close

      'Returncode setzen  
      intResult = 0
    Else 'Datei mit Codierungsalphabet existiert nicht  
      'Fehlermeldung ausgeben  
      WScript.Echo "Alphabetdatei " & strAlphabetFile & " nicht gefunden." & vbCrLf  

      'Hilfe ausgeben  
      PrintHelp

      'Returncode setzen  
      intResult = 3
    End If
  Else 'Eingabedatei existiert nicht  
    'Fehlermeldung ausgeben  
    WScript.Echo "Eingabedatei " & strInFile & " nicht gefunden." & vbCrLf  

    'Hilfe ausgeben  
    PrintHelp

    'Returncode setzen  
    intResult = 2
  End If
Else 'Aufruf ohne Parameter  
  'Hilfe ausgeben  
  PrintHelp

  'Returncode setzen  
  intResult = 1
End If

'Script beenden und Returncode zurückliefern  
WScript.Quit intResult



'Unterprogramm zur Ausgabe der Hilfe  
Sub PrintHelp
  WScript.Echo "Aufruf       : " & WScript.ScriptName & " ""Dateipfad"" [""Alphabetdatei""]"  
  WScript.Echo
  WScript.Echo "Dateipfad    : Pfad der zu verschlüsselnden Datei."  
  WScript.Echo "Alphabetdatei: Pfad zur Datei mit dem Codierungsalphabet."  
  WScript.Echo "               Falls nicht angegeben, wird im aktuellen Verzeichnis"  
  WScript.Echo "               nach der Datei " & strStdAlphabetFile & " gesucht."  
End Sub

Den Code z.B. als Encode.vbs speichern und dann folgendermaßen aufrufen:

cscript /nologo encode.vbs "PfadDerEingabedatei" ["PfadDerAlphabetdatei"]

Der Pfad zur Alphabetdatei ist optional. Wenn nicht angegeben, wird im aktuellen Verzeichnis nach einer Datei namens Alphabet.txt gesucht, die das Codierungsalphabet in der von Dir beschriebenen Form enthalten muss, also z.B.
a=&%n<
b=)?"§  
usw.

Du musst für Groß- und Kleinbuchstaben separate Einträge in der Datei anlegen oder in Zeile 44 die 0 durch eine 1 ersetzen.

Um VBScript zu lernen: Google mal nach script56.chm (englische Version von MS) oder lade Dir von hier die (teilweise) deutsche Version.

Eine gute Übung wäre, den Decoder selbst zu schreiben face-wink . Du musst nur einige wenige Änderungen an obigem Code durchführen.

Noch ein Tipp: Falls Du wirklich die Zeichen aus der Eingabedatei durch mehrere Zeichen in der Ausgabedatei codieren willst, nimm für alle Zeichen eine konstante Anzahl Ersetzungszeichen.

Gruß
Friemler