Citar
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::Decriptor del sistema de encriptacion generico monoalfabetico por
:: sustitucion
::Escrito por: lShadowl
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off
setlocal enabledelayedexpansion
:::::::::::::::::::::::::
::Establece las variables
:::::::::::::::::::::::::
set/p str=Cadena cifrada:
echo.&&echo.&&echo.
set abc=abcdefghijklmn_opqrstuvwxyz
set phieuler27=18
set str_len=0
set cnt=0
set ret=0
call :set_len
set/a s_len=%str_len%-1
echo.>%temp%\p.tmp
echo.>outp.txt
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::Busca el conjunto de letras que utiliza la cadena cifrada
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
for /l %%x in (0,1,%str_len%) do (
if !cnt!==0 (
set letra_!cnt!=!str:~0,1!
set /a cnt+=1
) else (
set ret=1
set/a v=!cnt!-1
for /l %%y in (0,1,!v!) do call:cmp !letra_%%y! !str:~%%x,1!
if !ret!==1 (
set letra_!cnt!=!str:~%%x,1!
set /a cnt+=1
)
)
)
set /a cnt-=2
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::Busca el numero de repeticiones que tienen cada una de las letras
:: del conjunto de letras de la cadena cifrada
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
for /l %%x in (0,1,%str_len%) do (
for /l %%y in (0,1,%cnt%) do (
call:cmp !letra_%%y! !str:~%%x,1! %%y
)
)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::Realiza el ordenamiento de menor a mayor de las letras en relacion
:: a su cantidad de repeticiones en la cadena cifrada
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set/a uv=%cnt%-1
set/a uv2=%cnt%
for /l %%a in (0,1,%uv%) do (
set/a vaux=%%a+1
for /l %%b in (!vaux!,1,!uv2!) do (
if /I !cnt_%%a! gtr !cnt_%%b! (
set tmp=!cnt_%%a!
set tmp_l=!letra_%%a!
set cnt_%%a=!cnt_%%b!
set letra_%%a=!letra_%%b!
set cnt_%%b=!tmp!
set letra_%%b=!tmp_l!
)
)
)
::::::::::::::::::::::::::::::::
::Genera el alfabeto del mensaje
::::::::::::::::::::::::::::::::
set Kabc=%letra_0%
for /l %%a in (1,1,%cnt%) do (call:k %%a)
if /I %cnt% lss 27 (
for %%a in (a b c d e f g h i j k l m n _ o p q r s t u v w x y z) do (
echo !Kabc!|find "%%a">nul
if !errorlevel!==1 set Kabc=!Kabc!%%a
)
)
::::::::::::::::::::::::::
::Busqueda de congruencias
::::::::::::::::::::::::::
set/a ma=0,sw=0
:m1
set mb=0
if %ma%==0 (
if %sw%==0 (
set sw=1
goto :m2
)
) else if %ma%==26 goto :end
set/a ma+=1
:m2
set mc=0
set/a mb+=1
if not %mb%==27 (
if %mb%==%ma% (goto :m2)
) else goto :m1
:m3
set/a mc+=1
if not %mc%==27 (
if %mc%==%ma% (
goto :m3
) else if %mc%==%mb% goto :m3
rem echo %ma% %mb% %mc%
call:atk %ma% %mb% %mc%
goto :m3
) else goto :m2
:end
echo FINALIZADO
goto:eof
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:atk
call:fndpos !Kabc:~%1,1! p1 abc
call:fndpos !Kabc:~%2,1! p2 abc
call:fndpos !Kabc:~%3,1! p3 abc
set/a b=%p2%%%27
set/a parta=%p3%-%p1%
if /I %parta% lss 0 set parta=27-%parta%
set/a a=(%parta%*5)%%27
call:mcd %a%
rem echo %p1%:%p2%:%p3% mcd=%mcd%
if %mcd%==1 (
for /f "tokens=* delims=" %%a in (%temp%\p.tmp) do if %a%%b%==%%a goto:eof
echo %a%%b%>>%temp%\p.tmp
set abc2=
set txt=
for /l %%x in (0,1,26) do (call:stABC %%x %a% %b%)
echo a=%a% b=%b% ^>^>
set txt=
for /l %%x in (0,1,%s_len%) do (call:stT %%x)
echo %txt%>>outp.txt
echo.&&echo.
)
goto:eof
::Realiza comparaciones de cadenas
:cmp
if %1==%2 (set ret=0&& if not '%3==' set val=%3&& set/a cnt_!val!+=1)
goto:eof
::Encuentra el largo de una cadena
:set_len
set var=!str:~%str_len%,1!
if %var%'==' goto:eof
set/a str_len+=1
goto:set_len
::Encuentra el maximo comun divisor
:mcd
set mcd=1
set cva=27
set cvb=%1
set i=2
:lop
set/a v_a=%cva%%%%i%,v_b=%cvb%%%%i%
if %V_a%%v_b%'==00' (
set/a mcd*=%i%
set/a cva/=%i%
set/a cvb/=%i%
set i=2
) else (set/a i+=1)
if /I not %i% geq %cva% goto:lop
goto:eof
::Genera la posible cadena
:stT
call:fndpos !str:~%1,1! t1 abc2
set/a t1%%=27
set/p txt=!abc:~%t1%,1!<nul
set txt=%txt%!abc:~%t1%,1!
goto:eof
::Genera el alfabeto para la ecuacion dada
:stABC
call:fndpos !abc:~%1,1! t1 abc
set/a ct=((%2*%t1%+(%3+1))%%27)
set abc2=%abc2%!abc:~%ct%,1!
goto:eof
::Busca el valor numerico de la letra dada
:fndpos
for /l %%a in (0,1,27) do (
set ret=1
call:cmp !%3:~%%a,1! %1
if !ret!==0 call set %2=%%a
)
goto:eof
:k
set Kabc=%Kabc%!letra_%1!
goto:eof
::Decriptor del sistema de encriptacion generico monoalfabetico por
:: sustitucion
::Escrito por: lShadowl
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off
setlocal enabledelayedexpansion
:::::::::::::::::::::::::
::Establece las variables
:::::::::::::::::::::::::
set/p str=Cadena cifrada:
echo.&&echo.&&echo.
set abc=abcdefghijklmn_opqrstuvwxyz
set phieuler27=18
set str_len=0
set cnt=0
set ret=0
call :set_len
set/a s_len=%str_len%-1
echo.>%temp%\p.tmp
echo.>outp.txt
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::Busca el conjunto de letras que utiliza la cadena cifrada
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
for /l %%x in (0,1,%str_len%) do (
if !cnt!==0 (
set letra_!cnt!=!str:~0,1!
set /a cnt+=1
) else (
set ret=1
set/a v=!cnt!-1
for /l %%y in (0,1,!v!) do call:cmp !letra_%%y! !str:~%%x,1!
if !ret!==1 (
set letra_!cnt!=!str:~%%x,1!
set /a cnt+=1
)
)
)
set /a cnt-=2
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::Busca el numero de repeticiones que tienen cada una de las letras
:: del conjunto de letras de la cadena cifrada
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
for /l %%x in (0,1,%str_len%) do (
for /l %%y in (0,1,%cnt%) do (
call:cmp !letra_%%y! !str:~%%x,1! %%y
)
)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::Realiza el ordenamiento de menor a mayor de las letras en relacion
:: a su cantidad de repeticiones en la cadena cifrada
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set/a uv=%cnt%-1
set/a uv2=%cnt%
for /l %%a in (0,1,%uv%) do (
set/a vaux=%%a+1
for /l %%b in (!vaux!,1,!uv2!) do (
if /I !cnt_%%a! gtr !cnt_%%b! (
set tmp=!cnt_%%a!
set tmp_l=!letra_%%a!
set cnt_%%a=!cnt_%%b!
set letra_%%a=!letra_%%b!
set cnt_%%b=!tmp!
set letra_%%b=!tmp_l!
)
)
)
::::::::::::::::::::::::::::::::
::Genera el alfabeto del mensaje
::::::::::::::::::::::::::::::::
set Kabc=%letra_0%
for /l %%a in (1,1,%cnt%) do (call:k %%a)
if /I %cnt% lss 27 (
for %%a in (a b c d e f g h i j k l m n _ o p q r s t u v w x y z) do (
echo !Kabc!|find "%%a">nul
if !errorlevel!==1 set Kabc=!Kabc!%%a
)
)
::::::::::::::::::::::::::
::Busqueda de congruencias
::::::::::::::::::::::::::
set/a ma=0,sw=0
:m1
set mb=0
if %ma%==0 (
if %sw%==0 (
set sw=1
goto :m2
)
) else if %ma%==26 goto :end
set/a ma+=1
:m2
set mc=0
set/a mb+=1
if not %mb%==27 (
if %mb%==%ma% (goto :m2)
) else goto :m1
:m3
set/a mc+=1
if not %mc%==27 (
if %mc%==%ma% (
goto :m3
) else if %mc%==%mb% goto :m3
rem echo %ma% %mb% %mc%
call:atk %ma% %mb% %mc%
goto :m3
) else goto :m2
:end
echo FINALIZADO
goto:eof
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:atk
call:fndpos !Kabc:~%1,1! p1 abc
call:fndpos !Kabc:~%2,1! p2 abc
call:fndpos !Kabc:~%3,1! p3 abc
set/a b=%p2%%%27
set/a parta=%p3%-%p1%
if /I %parta% lss 0 set parta=27-%parta%
set/a a=(%parta%*5)%%27
call:mcd %a%
rem echo %p1%:%p2%:%p3% mcd=%mcd%
if %mcd%==1 (
for /f "tokens=* delims=" %%a in (%temp%\p.tmp) do if %a%%b%==%%a goto:eof
echo %a%%b%>>%temp%\p.tmp
set abc2=
set txt=
for /l %%x in (0,1,26) do (call:stABC %%x %a% %b%)
echo a=%a% b=%b% ^>^>
set txt=
for /l %%x in (0,1,%s_len%) do (call:stT %%x)
echo %txt%>>outp.txt
echo.&&echo.
)
goto:eof
::Realiza comparaciones de cadenas
:cmp
if %1==%2 (set ret=0&& if not '%3==' set val=%3&& set/a cnt_!val!+=1)
goto:eof
::Encuentra el largo de una cadena
:set_len
set var=!str:~%str_len%,1!
if %var%'==' goto:eof
set/a str_len+=1
goto:set_len
::Encuentra el maximo comun divisor
:mcd
set mcd=1
set cva=27
set cvb=%1
set i=2
:lop
set/a v_a=%cva%%%%i%,v_b=%cvb%%%%i%
if %V_a%%v_b%'==00' (
set/a mcd*=%i%
set/a cva/=%i%
set/a cvb/=%i%
set i=2
) else (set/a i+=1)
if /I not %i% geq %cva% goto:lop
goto:eof
::Genera la posible cadena
:stT
call:fndpos !str:~%1,1! t1 abc2
set/a t1%%=27
set/p txt=!abc:~%t1%,1!<nul
set txt=%txt%!abc:~%t1%,1!
goto:eof
::Genera el alfabeto para la ecuacion dada
:stABC
call:fndpos !abc:~%1,1! t1 abc
set/a ct=((%2*%t1%+(%3+1))%%27)
set abc2=%abc2%!abc:~%ct%,1!
goto:eof
::Busca el valor numerico de la letra dada
:fndpos
for /l %%a in (0,1,27) do (
set ret=1
call:cmp !%3:~%%a,1! %1
if !ret!==0 call set %2=%%a
)
goto:eof
:k
set Kabc=%Kabc%!letra_%1!
goto:eof
PD: _=ñ
PD2: la frase a criptoanalizar escribanla en una sola linea sin espacios.