[Reto Batch] cifrado caesar

Iniciado por Eleкtro, 6 Mayo 2012, 13:11 PM

0 Miembros y 2 Visitantes están viendo este tema.

leogtz

Si tengo tiempo este fin de semana lo resuelvo, la universidad no me deja en paz :s
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

SmartGenius

Hace ya un tiempo habia publicado en el Blog un codigo de implementacion del Cifrado Cesar, es algo basico, pero cumple con su proposito.

@Echo Off&Title Caesar Crypt - SmartGenius
Setlocal Enabledelayedexpansion

:Init
Set /p "Text=Enter Text >"
If Not Defined Text Goto :Init
Set /p "Rot=Enter Seed >"
If Not Defined Rot Goto :Init
If 26 LEQ %Rot% Goto :Init
Call :Crypt.A Text Rot
Echo.
Echo. Result: %Text%
Echo.
Pause
Exit

:Crypt.A
If not defined %1 Goto:Eof
Set "c="
Set "d=ABCDEFGHIJKLMNOPQRSTUVWXYZ"
:Crypt.B
Set "chr=!%1:~,1!"
For /l %%l in (0 1 26) do (
if "!chr!" equ " " (
Set "%1=!%1:~1!"
Set "c=!c! "
Goto :Crypt.B)
if "!chr!" equ "!d:~%%l,1!" (
  set /a "x=(~((%%l-26)*-1)+!%~2!)+1"
  call set "c=!c!%%d:~!x!,1%%"
))
Set "%1=!%1:~1!"
If defined %1 goto:Crypt.B
Set "%1=!c!"
Goto :Eof


Es la implementacion normal, en mayusculas, con una rotacion maxima de 25, se puede ampliar el diccionario y un par de modificaciones en los limites para que funcione como ustedes quieren :)

Saludos.


Eleкtro

Cita de: SmartGenius en 11 Mayo 2012, 18:08 PM
Hace ya un tiempo habia publicado en el Blog un codigo de implementacion del Cifrado Cesar, es algo basico, pero cumple con su proposito.

Una solución de uno de los más grandes de Batch.  ;-)








BatchianoISpyxolo

#23
Sí, el código se puede optimizar xD pero no sé por qué tuve muchos problemas por los argumentos y bueno ahora es lo que es pero al menos funciona correctamente.

¡Saludos!

:: CIFRADO CAESAR - BATCHIANO :)
@echo off
setlocal enabledelayedexpansion
set "CHARS= abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
:MAIN
cls
echo.
echo CIFRADO CAESAR - BATCHIANO :)
echo.
echo. 1. cifrar
echo. 2. descifrar
echo. 3. salir
echo.
set /p op=Opcion:
if not defined op (
goto :main
) else (
if !op!==1 (
goto :cifrar
) else if !op!==2 (
goto :descifrar
) else (
exit/b
)
)
:cifrar
cls
set /p desp=Desplazamiento lateral:
set /p texto=Texto a cifrar:
for %%? in (desp,texto) do if not defined %%? goto :cifrar
call :analizar "e" "!texto!" !desp!
echo -------------------
echo. Texto cifrado: !cad!
pause>nul
goto :eof

:descifrar
cls
echo El formato para descifrar es [desplazamiento]texto - Ejemplo: 2razqnq
set /p texto=Texto a descifrar:
if not defined texto goto :descifrar
call :analizar "d" "!texto!"
echo -------------------
echo. Texto descifrado: !cad!
pause>nul
goto :eof

:analizar
set t=%~2
set TYPE=%~1
if "!TYPE!"=="e" (
set /a d=%3
set cad=!d!
set /a i=0
) else (
set /a i=1
set "cad="
set shift=!t:~0,1!
)
::while
:while
if "!t:~%i%,1!" NEQ "" (
call :find_char "!t:~%i%,1!" "!CHARS!"
call :class !return!
if "!TYPE!"=="e" (
set /a rd=!return!+!d!
) else (
set /a rd=!return!-!shift!
)
if "!CLASS!"=="NONE" (
set "cad=!cad!!t:~%i%,1!"
) else (
if "!CLASS!"=="SPACE" (
set "cad=!cad! "
) else (
if "!TYPE!"=="e" (
call :resize_enc !rd!
) else (
call :resize_dec !rd!
)
call :select_char "!CHARS!" !rd!
set "cad=!cad!!sc!"
)
)
set /a i+=1
goto :while)
goto :eof


:find_char
set C=%~1
set L=%~2
set /a pos=0
:loop
if "!C!" NEQ "!L:~%pos%,1!" (
set /a pos+=1
if !pos! LSS 64 (goto :loop)
)
set /a return=%pos%
goto :eof


:select_char
set lc=%~1
set key=%2
set sc=!lc:~%key%,1!
goto :eof


:class
if %1 == 0 (
set CLASS=SPACE
) else if %1 GTR 0 (
if %1 LSS 27 (
set CLASS=MIN
) else if %1 LSS 53 (
set CLASS=MAY
) else if %1 LSS 63 (
set CLASS=NUM
) else (
set CLASS=NONE
)
)
goto :eof


:resize_enc
if "!CLASS!"=="MIN" (
if !rd! gtr 26 (
set /a rd-=26
)
)
if "!CLASS!"=="MAY" (
if !rd! gtr 52 (
set /a rd-=26
)
)
if "!CLASS!"=="NUM" (
if !rd! gtr 62 (
set /a rd-=10
)
)
goto :eof

:resize_dec
if "!CLASS!"=="MIN" (
if !rd! lss 1 (
set /a rd+=26
)
)
if "!CLASS!"=="MAY" (
if !rd! lss 26 (
set /a rd+=26
)
)
if "!CLASS!"=="NUM" (
if !rd! lss 52 (
set /a rd+=10
)
)
goto :eof
Puede que desees aprender a programar desde 0: www.espascal.es

Binary_Death

#24
Dejo aquí lo que hice yo:


@Echo Off
setlocal enableextensions enabledelayedexpansion

set /p "text=Texto: "
set /p "rotn=Desplazamiento: "
call:_caesar "%text%" "%rotn%"
echo: -Cadena cifrada ^>^> %ret_str%

pause 1>nul & exit

:_caesar
if "%~1" EQU "" goto :EoF
set "chr_lst=abcdefghijklmnopqrstuvwxyz"
set "string=%~1" & set "ret_str="
for /l %%i in (0,1,25) do set/a c[!chr_lst:~%%i,1!]=%%i
set /a cnt=-1
:__loop.a
set /a cnt+=1
set "chr=!string:~%cnt%,1!"
if not defined chr goto :eof
if "%chr%" EQU " " set "ret_str=%ret_str% " & goto :__loop.a
set /a "num_cs=(!c[%chr%]!+%~2) %% 26"
set "ret_str=%ret_str%!chr_lst:~%num_cs%,1!"
goto :__loop.a


PD: Ups! Se me olvidó lo de descifrar. Pero da igual, basta con poner la clave en negativo.
Por ejemplo, si cifras "hola" con desplazamiento 5, da "mtqf". Si cifras "mtqf" con desplazamiento -5 da "hola". Así que supongo que os sirve igual  :P

PD2: Funciona tanto con mayúsculas como con minúsculas, pero la cadena cifrada la retorna siempre en minúsculas.