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
Vielen Dank im voraus!
Shadowmind
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 539893
Url: https://administrator.de/contentid/539893
Ausgedruckt am: 22.11.2024 um 22:11 Uhr
9 Kommentare
Neuester Kommentar
Moin,
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 ... ).
Als nächsten Schritt willst Du dann wahrscheinlich die Enigma in Batch umsetzen
Gruß
cykes
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-Chiffreda ich unter meiner letzten frage einen kommentar hinsichtlich der sicherheit gelesen habe, möchte ich nun einen Vigenere Chiffre anwenden.
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
Gruß
cykes
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.
ich weiß zwar nicht warum auf solche komische Ideen kommt.
Und in wieweit deine Batchkenntnisse sind, deshalb etwas Lesefutter bzgl. Windows Batch:
- Windows Batch Grundlagen
- Batch - ein paar Basics die man kennen sollte
- Workshop Batch for Runaways - Part I
- Workshop Batch for Runaways - Part II
- Workshop Batch for Runaways - Part III
- HowTo - Wie man Subroutinen in Batchfiles erstellt
- Tutorial zur FOR-Schleife
Bzgl. der Umsetzung gibt es bessere Möglichkeiten als Batch.
Gruss Penny.
Batch würde ich ganz schnell wieder vergessen - du scriptest dir nen Wolf. Ich hatte das vor einigen Jahren mit Freepascal realisiert:
Und das ist nur die Basis-Unit ...
Gruß
Ankh
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
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.
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