julian57
Goto Top

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!!!
 FOR /f %%f IN (%wahl%.txt) DO set x=%%f
Hier mein aktueller Code:
@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]

Content-ID: 156442

Url: https://administrator.de/forum/atbashverfahren-zum-laufenbringen-156442.html

Ausgedruckt am: 27.12.2024 um 19:12 Uhr

pieh-ejdsch
pieh-ejdsch 06.12.2010 um 23:26:19 Uhr
Goto Top
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
@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
Julian57
Julian57 07.12.2010 um 15:25:52 Uhr
Goto Top
Hallo,
Versteh leider noch Bahnhof
Was ist Offset und Ackerst?

Wäre nett wenn du das mir direkt mit meinen Programm verknüpfen könntest.

mfg

Julian57
pieh-ejdsch
pieh-ejdsch 08.12.2010 um 23:04:05 Uhr
Goto Top
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
Julian57
Julian57 09.12.2010 um 17:35:55 Uhr
Goto Top
Danke für die kurze Erklärung :D
Und danke das du das Script fertig machst,
kannst dir auch ruhig Zeit lassen damit
pieh-ejdsch
pieh-ejdsch 12.12.2010 um 02:17:16 Uhr
Goto Top
Hi Julian,

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
Julian57
Julian57 12.12.2010 um 19:15:46 Uhr
Goto Top
Hey super genau so hab ich mir das vorgestellt.
danke Phil :D
pieh-ejdsch
pieh-ejdsch 12.12.2010 um 20:14:18 Uhr
Goto Top
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