Atbashverfahren zum laufenbringen
Hallo,
ich habe heute angefangen einen Batch zu schreiben der mir Texte nach Atbash verschlüsselt
Ich habe dabei noch einige Problem festgestellt
1. Programm verschlüsselt nicht zuverlässig, d.h. kommen Fehler vor.
z.B. ich verschlüssel "Hallo" dann kommt erstmal "szooo" raus,
wenn ich es dann entschlüssele kommt wiederrum "Halll" heraus
2. Würde gerne den Inhalt einer txt komplett auslesen und in einer Variable speichern,
funktioniert leider nicht wie ich das schon habe!!!
Hier mein aktueller Code:
Ich hoffe ihr könnt mir bei meinen zwei anliegen helfen
mfg
Julian57
[edit]Code durch funktionierenden Code ersetzt[/edit]
ich habe heute angefangen einen Batch zu schreiben der mir Texte nach Atbash verschlüsselt
Ich habe dabei noch einige Problem festgestellt
1. Programm verschlüsselt nicht zuverlässig, d.h. kommen Fehler vor.
z.B. ich verschlüssel "Hallo" dann kommt erstmal "szooo" raus,
wenn ich es dann entschlüssele kommt wiederrum "Halll" heraus
2. Würde gerne den Inhalt einer txt komplett auslesen und in einer Variable speichern,
funktioniert leider nicht wie ich das schon habe!!!
FOR /f %%f IN (%wahl%.txt) DO set x=%%f
@echo off&setlocal
title Atbash
:Anfang
set "Neu="
echo **Hauptmenu**
echo.
echo Bitte waehlen sie eine Aktion aus:
echo.
echo [1] Text ver-/entschlusseln
echo [2] Programm beenden
echo.
set /p wahl=
If %wahl%==1 (cls & goto ver)
If %wahl%==2 (del "%~dp0LineOffSet1.cmd" "%~dp0LineOffSet.cmd" & goto :eof)
echo falsche Eingabe
pause
cls
goto Anfang
:ver
Echo Waehlen sie eine Aktion aus:
echo [1] Text manuell eingeben
echo [2] Text aus Textdokument auslesen
set /p wahl=
If %wahl%==1 (cls & goto verman)
If %wahl%==2 (cls & goto verlesen)
goto ver
:verman
echo Orginaltext:
set /p Original=
echo.
if not defined Original goto :verman
set "Usebackq="
echo Neuertext:
call :Lineoffset
echo.
goto verwahl
:verlesen
echo Bitte geben sie den korekten Pfad des Text-Dokuments an!!!
set /p Original=
if not exist "%Original%" goto :verlesen
set "Usebackq=usebackq"
echo.
echo Ausgelesener Text:
for /f "usebackq delims=" %%i in ("%Original%") do echo %%i
echo.&echo Neuer Text:
call :Lineoffset
:verwahl
echo.
echo Wollen sie den Text in ein Text-Dokument speichern?
echo [1]Ja, [2]Nein
set /p wahl=
If %wahl%==1 (goto vertxt)
If %wahl%==2 (cls & goto Anfang)
cls
goto verwahl
:vertxt
cls
echo Geben sie bitte den Textdokument einen Namen
set /p wahl=
if not defined wahl goto :vertxt
setlocal enabledelayedexpansion
if defined usebackq (
( for /l %%i in (1,1,%Nr%) do echo.!%%iLineout!
)>%wahl%.txt
)&endlocal & cls & goto :Anfang
(echo OrginalText: !Original!
echo Neuertext : !1Lineout!
endlocal
)>> %wahl%.txt
cls
goto Anfang
:Lineoffset
@echo off
if defined Satz goto :read
::AtBash funktioniert mit 2 Angebenen Zeichen das erste wird mit dem 2. ersetzt
set "Crypt=atbash"
set "Crypt1=%Crypt:~0,1%"
set "Crypt2=%Crypt:~1,1%"
(echo @echo off ^& setlocal enabledelayedexpansion
echo echo.!Line1!
echo endlocal
)>"%~dp0LineOffSet1.cmd"
(echo @echo off ^& setlocal enabledelayedexpansion
echo echo.!Line!
echo echo.
echo endlocal
)>"%~dp0LineOffSet.cmd"
setlocal enabledelayedexpansion
(echo.!Crypt1!
)>"%temp%\Crypt1"
(echo.!Crypt2!
)>"%temp%\Crypt2"
::Zeichensatz zum Verschlüsseln angeben
for %%i in (a A b B c C d D e E f F g G H h i I j J k K l L m M n N o O p P q Q r R s S t T u U v V w W x X y Y Z z 0 1 2 3 4 5 6 7 8 9) do set "Line=!Line!%%i"
for /f "delims=:" %%j in ('"%~dp0LineOffSet.cmd"^| findstr /o ^^^^') do set /a LE=%%j-3
for /l %%l in (0,1,!LE!) do (
set "Line1=!Line:~%%l,1!"
"%~dp0LineOffSet1.cmd"|findstr /g:"%temp%\Crypt1" >nul&& set CrNr1=%%l
"%~dp0LineOffSet1.cmd"|findstr /g:"%temp%\Crypt2" >nul&& set CrNr2=%%l
)
set "Satz=!Line!!Line!!Line:~0,%CrNr2%!!Line:~%CrNr2%,1!"
set /a LE+=CrNr1
(for /l %%l in (%CrNr1%,1,!LE!) do for /f "delims=" %%i in ("!Satz:~%%l,1!") do echo %%i)>"%temp%\Orig"
endlocal&set "Usebackq=%usebackq%"&set "Satz=%Satz%"
:read
set /a Nr = 0
for /f "%usebackq% delims=" %%i in ("%Original%") do (set Line=%%i
set "Lineout="
for /f "delims=:" %%j in ('"%~dp0LineOffSet.cmd"^| findstr /o ^^^^') do set /a LE=%%j-3
setlocal enabledelayedexpansion
for /l %%k in (0,1,!LE!) do (set "Lineoff="
for /f "delims=" %%p in ("!Line:~%%k,1!") do (
for /f "tokens=1,2 delims=:" %%m in ('findstr /n ^^^^ "%temp%\Orig"') do (
for /f "delims=" %%o in ("!Satz:~-%%m,1!") do (
if "%%p" == "%%n" set "Lineoff=%%o"
) ) )
if not defined Lineoff (set "Lineout=!Lineout!!Line:~%%k,1!"
) else set "Lineout=!Lineout!!Lineoff!"
)
echo.!Lineout!
for /f %%k in ('set /a "Nr + = 1"') do for /f "delims=" %%j in ("!Lineout!") do endlocal& set "Nr=%%k"& set "%%kLineout=%%j"
)%Neu%
goto :eof
Ich hoffe ihr könnt mir bei meinen zwei anliegen helfen
mfg
Julian57
[edit]Code durch funktionierenden Code ersetzt[/edit]
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 156442
Url: https://administrator.de/forum/atbashverfahren-zum-laufenbringen-156442.html
Ausgedruckt am: 27.12.2024 um 19:12 Uhr
7 Kommentare
Neuester Kommentar
moin Julian,
das mit dem Umettikettieren des gesamten Textes mittels mehreren set Anweisungen hintereinander ist eine Schlechte Wahl. Jedenfalls so.
als Beispiel: "abczyx" würde mit dem Vollständigen Atbash-Algorithmus komplett zu "abcabc" werden - weil wenn x, y und z Verschlüsselt wird sind ja a, b und c auch schon zu x, y sowie z mutiert.
Am besten arbeitest Du mit Offsets und Ackerst jedes Zeichen der gesamten Zeile nacheinander ab.
in etwa so
Gruß Phil
das mit dem Umettikettieren des gesamten Textes mittels mehreren set Anweisungen hintereinander ist eine Schlechte Wahl. Jedenfalls so.
als Beispiel: "abczyx" würde mit dem Vollständigen Atbash-Algorithmus komplett zu "abcabc" werden - weil wenn x, y und z Verschlüsselt wird sind ja a, b und c auch schon zu x, y sowie z mutiert.
Am besten arbeitest Du mit Offsets und Ackerst jedes Zeichen der gesamten Zeile nacheinander ab.
in etwa so
@echo off & setlocal
:: Das Programm "LineOffSet.cmd" ist zum Feststellen der Zeilenlaenge erforderlich wenn Sonderzeichen im Text sind!
(echo @echo off ^& setlocal enabledelayedexpansion
echo echo.!Line!
echo echo.
echo endlocal
)>"%~dp0LineOffSet.cmd"
:: %~1 ist Deine Datei als angegebener Parameter oder Du ersetzt es mit %wahl%.txt
for /f "usebackq delims=" %%i in ("%~1") do (set Line=%%i
set "Lineout="
for /f "delims=:" %%j in ('"%~dp0LineOffSet.cmd"^|findstr /o .*') do set /a LE=%%j-3
setlocal enabledelayedexpansion
for /l %%k in (0,1,!LE!) do (
set "lineoff=!Line:~%%k,1!"
:: Comment
:: Hier kommt Dein Algorithmus rein
:: set "!lineoff:a=z!"
:: set "!lineoff:z=a!"
:: .......
:: echo !lineoff!
set "Lineout=!Lineout!!Lineoff!"
)
echo !Lineout!
endlocal
)
del "%~dp0LineOffSet.cmd"
goto :eof
Gruß Phil
Hi Julain,
also der Offset von einem, Zeichen ist die genaue Positiion des Zeichens in der Zeile bzw. angegebenen Zeichenfolge (womit "FINDSTR /O" bis Dato noch Probleme hat!) für mich aber nicht ...
hehe und "Ackerst" synonym für Durchabreiten: der Reihe nacheinander abarbeiten - vom Wortstamm: den Acker bearbeiten.
der "atbash" Algoritmus ist ja im Grunde genommen wie die Enigma-(De-)Chiffrierung (monographischen Algorithmus) aufgebaut nur das die entsprechenden Zeichen Rückwärts wieder aus dem Zeichensatz chiffriert werden und auch die Hin-Chiffrierung umgekehrt zur Rück-Chiffrierung ist - sprich die Ver-Schlüselung ist mit der Ent-Schlüsselung identisch und braucht nicht seperat gemacht zu werden.
ich hatte heute einen langen Arbeitstag, Geburtstag war auch noch nachzufeiern ... bin zwar schon beim bearbeiten an Deinem Script, aber jetzt ist erst mal Schicht im Schacht. Ich werde mich morgen mal länger dransetzen.
Gruß Phil
also der Offset von einem, Zeichen ist die genaue Positiion des Zeichens in der Zeile bzw. angegebenen Zeichenfolge (womit "FINDSTR /O" bis Dato noch Probleme hat!) für mich aber nicht ...
hehe und "Ackerst" synonym für Durchabreiten: der Reihe nacheinander abarbeiten - vom Wortstamm: den Acker bearbeiten.
der "atbash" Algoritmus ist ja im Grunde genommen wie die Enigma-(De-)Chiffrierung (monographischen Algorithmus) aufgebaut nur das die entsprechenden Zeichen Rückwärts wieder aus dem Zeichensatz chiffriert werden und auch die Hin-Chiffrierung umgekehrt zur Rück-Chiffrierung ist - sprich die Ver-Schlüselung ist mit der Ent-Schlüsselung identisch und braucht nicht seperat gemacht zu werden.
ich hatte heute einen langen Arbeitstag, Geburtstag war auch noch nachzufeiern ... bin zwar schon beim bearbeiten an Deinem Script, aber jetzt ist erst mal Schicht im Schacht. Ich werde mich morgen mal länger dransetzen.
Gruß Phil
Hi Julian,
hier ist der aufbereitete Code und etas verkürzt. Hoffe es gefällt Dir so.
[Edit] code kommpletiert (siehe nächste Anwort von mir) [/Edit]
Gruß Phil
hier ist der aufbereitete Code und etas verkürzt. Hoffe es gefällt Dir so.
@echo off&setlocal
title Atbash
:Anfang
set "Neu="
echo **Hauptmenu**
echo.
echo Bitte waehlen sie eine Aktion aus:
echo.
echo [1] Text ver-/entschlusseln
echo [2] Programm beenden
echo.
set /p wahl=
If %wahl%==1 (cls & goto ver)
If %wahl%==2 (del "%~dp0LineOffSet1.cmd" "%~dp0LineOffSet.cmd" & goto :eof)
echo falsche Eingabe
pause
cls
goto Anfang
:ver
Echo Waehlen sie eine Aktion aus:
echo [1] Text manuell eingeben
echo [2] Text aus Textdokument auslesen
set /p wahl=
If %wahl%==1 (cls & goto verman)
If %wahl%==2 (cls & goto verlesen)
goto ver
:verman
echo Orginaltext:
set /p Original=
echo.
if not defined Original goto :verman
set "Usebackq="
echo Neuertext:
call :Lineoffset
echo.
goto verwahl
:verlesen
echo Bitte geben sie den korekten Pfad des Text-Dokuments an!!!
set /p Original=
if not exist "%Original%" goto :verlesen
set "Usebackq=usebackq"
echo.
echo Ausgelesener Text:
for /f "usebackq delims=" %%i in ("%Original%") do echo %%i
echo.&echo Neuer Text:
call :Lineoffset
:verwahl
echo.
echo Wollen sie den Text in ein Text-Dokument speichern?
echo [1]Ja, [2]Nein
set /p wahl=
If %wahl%==1 (goto vertxt)
If %wahl%==2 (cls & goto Anfang)
cls
goto verwahl
:vertxt
cls
echo Geben sie bitte den Textdokument einen Namen
set /p wahl=
if not defined wahl goto :vertxt
setlocal enabledelayedexpansion
if defined usebackq (
( for /l %%i in (1,1,%Nr%) do echo.!%%iLineout!
)>%wahl%.txt
)&endlocal & cls & goto :Anfang
(echo OrginalText: !Original!
echo Neuertext : !1Lineout!
endlocal
)>> %wahl%.txt
cls
goto Anfang
:Lineoffset
@echo off
if defined Satz goto :read
::AtBash funktioniert mit 2 Angebenen Zeichen das erste wird mit dem 2. ersetzt
set "Crypt=atbash"
set "Crypt1=%Crypt:~0,1%"
set "Crypt2=%Crypt:~1,1%"
(echo @echo off ^& setlocal enabledelayedexpansion
echo echo.!Line1!
echo endlocal
)>"%~dp0LineOffSet1.cmd"
(echo @echo off ^& setlocal enabledelayedexpansion
echo echo.!Line!
echo echo.
echo endlocal
)>"%~dp0LineOffSet.cmd"
setlocal enabledelayedexpansion
(echo.!Crypt1!
)>"%temp%\Crypt1"
(echo.!Crypt2!
)>"%temp%\Crypt2"
::Zeichensatz zum Verschlüsseln angeben
for %%i in (a A b B c C d D e E f F g G H h i I j J k K l L m M n N o O p P q Q r R s S t T u U v V w W x X y Y Z z 0 1 2 3 4 5 6 7 8 9) do set "Line=!Line!%%i"
for /f "delims=:" %%j in ('"%~dp0LineOffSet.cmd"^| findstr /o ^^^^') do set /a LE=%%j-3
for /l %%l in (0,1,!LE!) do (
set "Line1=!Line:~%%l,1!"
"%~dp0LineOffSet1.cmd"|findstr /g:"%temp%\Crypt1" >nul&& set CrNr1=%%l
"%~dp0LineOffSet1.cmd"|findstr /g:"%temp%\Crypt2" >nul&& set CrNr2=%%l
)
set "Satz=!Line!!Line!!Line:~0,%CrNr2%!!Line:~%CrNr2%,1!"
set /a LE+=CrNr1
(for /l %%l in (%CrNr1%,1,!LE!) do for /f "delims=" %%i in ("!Satz:~%%l,1!") do echo %%i)>"%temp%\Orig"
endlocal&set "Usebackq=%usebackq%"&set "Satz=%Satz%"
:read
set /a Nr = 0
for /f "%usebackq% delims=" %%i in ("%Original%") do (set Line=%%i
set "Lineout="
for /f "delims=:" %%j in ('"%~dp0LineOffSet.cmd"^| findstr /o ^^^^') do set /a LE=%%j-3
setlocal enabledelayedexpansion
for /l %%k in (0,1,!LE!) do (set "Lineoff="
for /f "delims=" %%p in ("!Line:~%%k,1!") do (
for /f "tokens=1,2 delims=:" %%m in ('findstr /n ^^^^ "%temp%\Orig"') do (
for /f "delims=" %%o in ("!Satz:~-%%m,1!") do (
if "%%p" == "%%n" set "Lineoff=%%o"
) ) )
if not defined Lineoff (set "Lineout=!Lineout!!Line:~%%k,1!"
) else set "Lineout=!Lineout!!Lineoff!"
)
echo.!Lineout!
for /f %%k in ('set /a "Nr + = 1"') do for /f "delims=" %%j in ("!Lineout!") do endlocal& set "Nr=%%k"& set "%%kLineout=%%j"
)%Neu%
goto :eof
[Edit] code kommpletiert (siehe nächste Anwort von mir) [/Edit]
Gruß Phil
Hi Julian,
freut mich das es so passt.
ich hab noch eine Kleine Änderung eingebaut, damit die Zeilen aus einer *.txt jeweils in eine Variable gespeichert werden und das abspeichern des Umchiffrierten Textes ins neue Dokument schneller vonstatten geht.
Bearbeitest Du bitte Deinen Start-Beitrag und setzt einen Grünen Hacken: \/
Danke
Gruß Phil
freut mich das es so passt.
ich hab noch eine Kleine Änderung eingebaut, damit die Zeilen aus einer *.txt jeweils in eine Variable gespeichert werden und das abspeichern des Umchiffrierten Textes ins neue Dokument schneller vonstatten geht.
Bearbeitest Du bitte Deinen Start-Beitrag und setzt einen Grünen Hacken: \/
Danke
Gruß Phil