[Batch] Criptoanalizador del cifrado generico monoalfabetico por sustitucion

Iniciado por lShadowl, 26 Febrero 2011, 14:23 PM

0 Miembros y 1 Visitante están viendo este tema.

lShadowl

Se que aun puede tener alguno que otro fallo, pero aun no los he encontrado. Tambien me gustaria agilizar el proceso un poco mas.
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

PD: _=ñ
PD2: la frase a criptoanalizar escribanla en una sola linea sin espacios.

Linux Registered User #473016

Sarcasm....because arguing with stupid people is not nearly as fun.
-INTJ