shadowminder
Goto Top

Codieren von Texten mit der Vigenere Chiffre in .bat

Hallo miteinander!

da ich unter meiner letzten frage einen kommentar hinsichtlich der sicherheit gelesen habe, möchte ich nun einen Vigenere Chiffre anwenden.

da ich aber ehrlich gesagt keine Ahnung habe wie man das in batch verwirklicht, bitte ich euch um mithilfe.

einen kleinen Lösungsvorschlag habe ich:

wenn man jedes zeichen in einer textdatei einzeln ausliest und diesem dann einen temporären Nummerischen wert gibt (wobei die zahlen 0123456789 ihren wert behalten), könnte man mit einem Nummerischen schlüssel den wert des zeichens verändern. schließlich wird der veränderte (verschlüsselte) wert wieder als Zeichen eingesetzt.


also

  • erstes zeichen wird ausgelesen. Z.B.: "H"

  • "H" wird ein nummerischer wert gegeben, also wird aus der tabelle "H" herausgelesen und die position im text ist der Numerische Wert (0123456789ABCDEFG "H" IJKLMNOPQRSTUVWXYZ)
  • H ist nun wert 17

  • durch einen schlüssel, z.B: 8325325, wird 17 + 8 gerechnet
  • H ist nun wert 25

  • der Numerische wert wird nun wieder durch das zeichen an der jeweiligen position ersetzt, also (0123456789ABCDEFGHIJKLMNO "P" QRSTUVWXYZ)

  • nun wird "P" statt "H" eingesetzt.

  • wenn der zweite buchstabe auch ein "H" wäre, würde es durch ein "K" ersetzt.

Vielen Dank im voraus!

Shadowmind

Content-ID: 539893

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

Ausgedruckt am: 22.11.2024 um 22:11 Uhr

cykes
cykes 26.01.2020 aktualisiert um 11:50:20 Uhr
Goto Top
Moin,

Zitat von @Shadowminder:
da ich unter meiner letzten frage einen kommentar hinsichtlich der sicherheit gelesen habe, möchte ich nun einen Vigenere Chiffre anwenden.
Deine folgende Beschreibung ist aber eine Variante des Vigenère-Chiffre und nennt sich Gronsfeld-Chiffre. Dafür finden sich sicher massenweise Progrmmierbeispiele. Vgl. https://de.wikipedia.org/wiki/Vigen%C3%A8re-Chiffre
Warum Du das mit der Gewalt in Batch umsetzen willst, erschliesst sich mir auch nicht so ganz, aber das ist Dein Ding. Du musst nur das Ersetzungsquadrat/-matrix in Deinem Programm abbilden. Wesentlich sicherer ist das allerdings auch nicht (siehe Wikipedia bzw. http://www.mathe.tu-freiberg.de/~hebisch/cafe/kryptographie/gronsfeld.h ... ).
da ich aber ehrlich gesagt keine Ahnung habe wie man das in batch verwirklicht, bitte ich euch um mithilfe.
Deine Einschränkung auf Batch hindert Dich hier an der Umsetzung, das wird in Batch auch sehr unübersichtlich und Fehler lassen sich nur schwer finden.

Als nächsten Schritt willst Du dann wahrscheinlich die Enigma in Batch umsetzen face-wink

Gruß

cykes
Shadowminder
Shadowminder 26.01.2020 um 11:53:28 Uhr
Goto Top
danke für die Idee face-wink
Lochkartenstanzer
Lochkartenstanzer 26.01.2020 um 11:57:39 Uhr
Goto Top
Moin,

Die Zeichen haben ascii-Werte. Dazu kann man Schlüssel addieren und subtrahieren, ggf. Modulo rechnen.

Eigentlich ist das trivial.

lks
Shadowminder
Shadowminder 26.01.2020 um 12:01:24 Uhr
Goto Top
Moin

Wie aber kann ich die zeichen einzeln auslesen und mit dem schlüssel vergleichen?

Danke für deinen kommentar
Penny.Cilin
Penny.Cilin 26.01.2020 um 12:18:35 Uhr
Goto Top
Moin,

ich weiß zwar nicht warum auf solche komische Ideen kommt.
Und in wieweit deine Batchkenntnisse sind, deshalb etwas Lesefutter bzgl. Windows Batch:

Bzgl. der Umsetzung gibt es bessere Möglichkeiten als Batch.

Gruss Penny.
Shadowminder
Shadowminder 26.01.2020 um 13:13:50 Uhr
Goto Top
danke
AnkhMorpork
Lösung AnkhMorpork 27.01.2020 um 08:27:40 Uhr
Goto Top
Batch würde ich ganz schnell wieder vergessen - du scriptest dir nen Wolf. Ich hatte das vor einigen Jahren mit Freepascal realisiert:

interface
uses SysUtils;

CONST
Min_Matrix=1;
Max_Matrix=255;
Min_Upper_Char=65;
Max_Upper_Char=90;
Min_Lower_Char=97;
Max_Lower_Char=122;

VAR i,j,k:INTEGER;
    Vigenere_Matrix:ARRAY[Min_Matrix..Max_Matrix,Min_Matrix..Max_Matrix] OF CHAR;

    PROCEDURE Create_Matrix;
    FUNCTION MakeKey(KeyWord,Text_Str:STRING):STRING;
    FUNCTION Encrypt(KeyWord,Klartext:STRING):STRING;
    FUNCTION Decrypt(KeyWord,Chiffretext:STRING):STRING;


implementation

uses Skytale_FormUnit;

    PROCEDURE Create_Matrix;
    BEGIN
         FOR i:=Min_Matrix TO Max_Matrix DO
         BEGIN
              k:=i-1;
              FOR j:=Min_Matrix TO Max_Matrix DO
              BEGIN
                   IF k < Max_Matrix THEN
                      INC(k)
                   ELSE
                      k:=Min_Matrix;
                   Vigenere_Matrix[i,j]:=CHR(k);   //Ansi-Zeichencodierung!
              END;
         END;
    END;

    FUNCTION MakeKey(Keyword,Text_Str:STRING):STRING;
    VAR KeyString:STRING;
    BEGIN
         //Schlüssel erstellen
         KeyString:='';  
         WHILE LENGTH(KeyString) <= LENGTH(Text_Str) DO
               KeyString:=KeyString+KeyWord;
         KeyString:=COPY(KeyString,1,LENGTH(Text_Str));
         MakeKey:=KeyString;
    END;

    FUNCTION Encrypt(KeyWord,Klartext:STRING):STRING;
    VAR Schluessel:STRING;
        Codiert:STRING;
    BEGIN
         //Text verschlüsseln
         Schluessel:=MakeKey(Keyword,KlarText);
         Codiert:='';  
         FOR i:=1 TO LENGTH(KlarText) DO
         BEGIN
             //äußere Schleife: gesamter STRING, innere Schleife: einzelne Zeichen im String
             FOR j:=Min_Matrix TO Max_Matrix DO
                 IF CompareStr(Schluessel[i],Vigenere_Matrix[j,Min_Matrix])=0 THEN
                    FOR k:=Min_Matrix TO Max_Matrix DO
                        IF CompareStr(KlarText[i],Vigenere_Matrix[Min_Matrix,k])=0 THEN
                           Codiert:=Codiert+Vigenere_Matrix[j,k];
         END;
         Encrypt := Codiert;
    END;


    FUNCTION Decrypt(KeyWord,Chiffretext:STRING):STRING;
    VAR Schluessel:STRING;
        Decodiert:STRING;
    BEGIN
         //Text entschlüsseln
         Schluessel:=MakeKey(Keyword,ChiffreText);
         Decodiert:='';  
         FOR i:=1 TO LENGTH(ChiffreText) DO
         BEGIN
             //äußere Schleife: gesamter STRING, innere Schleife: einzelne Zeichen im String
             FOR j:=Min_Matrix TO Max_Matrix DO
                 IF CompareStr(Schluessel[i],Vigenere_Matrix[j,Min_Matrix])=0 THEN
                    FOR k:=Min_Matrix TO Max_Matrix DO
                        IF CompareStr(ChiffreText[i],Vigenere_Matrix[j,k])=0 THEN
                           Decodiert:=Decodiert+Vigenere_Matrix[Min_Matrix,k];
         END;
         Decrypt := Decodiert;
    END;

begin
     Create_Matrix;
end.

Und das ist nur die Basis-Unit ...

Gruß

Ankh
pieh-ejdsch
Lösung pieh-ejdsch 01.02.2020 aktualisiert um 00:24:33 Uhr
Goto Top
Moin Shadowmind,
das sollte sich schon gut lösen lassen.
Encoding/Decoding
Ist noch gar nicht so lange her:
Es sollte nur das Alphabet angepasst werden, wenn ein anderes benötigt wird.
@echo off
setlocal enabledelayedexpansion
call :setallmacros
>nul chcp 1252
::::::::::::::::::::::::::::: begin settings :::::::::::::::::::::::::::::::
:: create an alphabet for encryption
set "numC=0123456789"  
set "lowerC=abcdefghijklmnopqrstuvwxyz"   
set "upperC=ABCDEFGHIJKLMNOPQRSTUVWXYZ" without lowerC, the text is always encrypted as an UpperCase  
set "otherC=#$%%&'()*+,-./:;<=>?@[\]^^_`{|}~ ^!""  
set "extendC=àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß"  
set "specialC=‘’“”•–—˜™š›œž€‚ƒ„…†‡ˆ‰Š‹ŒŽŸ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿"  
set "alphabet="  
 rem  be sure to use only these selected characters in password or text
for %%i in (lower num other extend special upper) do set "alphabet=!alphabet!!%%iC!" &set "%%iC="  
::::::::::::::::::::::::::::: end settings :::::::::::::::::::::::::::::::::
call :genTable
:input -- Enter text, password and direction of the key
if NOT defined text set /p text="Enter text:"||goto :input  
set /p pass="Supply a password:"||goto :input  
call :yesNo "Do you want to encrypt the text:" ", the text will be decrypted if you choose:"  
if errorlevel 1 (set "dec=+") else set "dec=-"  
set "T1=!text!" -- calculate the encryption  
set "P1=!pass!"   
%strLen(var):var=!pass!%
set /a passO=len 
%strLen(var):var=!text!%
set /a len-=1
for /l %%T in (0 1 %len%) do ( set /a "passOff=%%T %%passO"  
 for %%P in (!passOff!) do ( %set Key0:key=P% )
 %set Key0:key=T%
 set /a "out=(cCount +T0 %dec%P0 ) %%cCount"  
 for %%i in (!out!) do set "new=!new!!%%i!"  
)
echo New:
echo(!new!
pause
exit /b

:YesNo Yes No query: [message]Y [message]N
setlocal
set "y=0"  
for /f "eol=0 tokens=3,4,6delims=(/) " %%a  in (  
 '"echo n|xcopy /L /-y %windir%\win.ini %windir%\system.ini"'  
) do ( <nul set/p"=%~1[%%a]%~2[%%b]%%c "  
 xcopy /Lpy "%~f0" nul:\* |findstr /b [1-9] >nul && (set /a "y=1" &echo %%a) || echo %%b  
)
exit /b %y%

:setAllMacros
:reduceEnvironment -- remove unnecessary variables
for /f "tokens=1-2 delims=;" %%i in ("cmd.exe;.") do (  
  for /f "delims==-" %%i in ('2^>nul set') do set "%%i="  
  set "COMSPEC=%COMSPEC%"  
  set "Path=%%~dp$PATH:i"  
  set "PATHEXT=%PATHEXT%"  
  set "prompt=$G$S"  
  set "temp=%temp%"  
  set "windir=%windir%"  
)
:newline -- with line continuation
(set \n=^^^
%= The empty line is critical - DO NOT REMOVE =%
)
set "lf=!\n:^=!" -- create a line break  
:strLen.var -- length of string
set strLen(var^)=(%\n%
 set "str=Avar"%\n%  
 set "len=0"!lf!  
for /l %%i in (12 -1 0) do set strLen(var^)=!strLen(var^)! set /a "len|=1<<%%i"%\n%  
 for %%# in (^^!len^^!^) do if .^^!str:~%%#^^^^,1^^!==. set /a "len&=~1<<%%i"!lf!  
set strLen(var^)=!strLen(var)!)
exit /b

:genTable -- Generate an encryption table from the specially provided alphabet
set "alphabet=!alphabet!!alphabet:~,1!"  
%strLen(var):var=!alphabet!%
set /a "cCount=(len-=1)"  
set set Key0=set "key0=-1"!lf!  
for /l %%i in (0 1 %len%) do ( set "%%i=!alphabet:~%%i,1!"  
  setlocal
  2>nul set /a "NN=XX=0, XX=!alphabet:~%%i,1!, !alphabet:~%%i,1!=%%i, NN=!alphabet:~%%i,1!,XX+=NN"  
  if %%i leq 9 if !alphabet:~%%i^,1! neq %%i set "XX=-1"  
  if !XX! equ %%i ( endlocal 
    set "!alphabet:~%%i,1!=%%i"  
  ) else ( endlocal 
    if ^^! equ !alphabet:~%%i^,1! (set "inplace=^") else set "inplace="  
    set set Key0=!set Key0!if ^^!key1:~%%key^^^^,1^^! equ ^^^^!inplace!!alphabet:~%%i,1! set /a key0=%%i!lf!
) )
set set Key0=!set Key0!if ^^!key0^^! lss 0 set /a "key0=^!key1:~%%key,1^!"  
exit /b
Shadowminder
Shadowminder 01.02.2020 um 10:07:51 Uhr
Goto Top
Danke für die mühe. Ich weiß das sehr zu schätzen.

damit ist die frage wohl wirklich komplett gelöst.

face-smile