Título: [Batch] Criptoanalizador del cifrado generico monoalfabetico por sustitucion Publicado por: lShadowl en 26 Febrero 2011, 14:23 pm 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. |