:: Base64 :: by wizard_0 (un Reto para TODOS)

Iniciado por wizard_0, 28 Noviembre 2008, 05:15 AM

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

wizard_0


Weno  aki  esta  el  reto...  8)

Se trata  de  la  Base64  un  metodo  de  cifrado
http://es.wikipedia.org/wiki/Base64


puej  lo  acabo  de  terminar...







@echo off
Title Encriptor--^>BASE64
setlocal enabledelayedexpansion
set e=echo
set sw=false
if %1. EQU . (echo Digite %~nx0 /? o help para mejor manejo&&goto fin)
if /I "%1" EQU "help" (call:help "%1") else (if "%1" EQU "/?" call:help "%1")
if /I "%1" NEQ "-c" (%e% Sintaxis Incorrecta..  %1&& exit)
if %2. NEQ . (set str=%2)
if %3. NEQ . (%e% Sintaxis Incorrecta..  && exit)
set str=%str:"=%
call:ini
cls
%e% Resultado...
%e%.
echo String  : %~2
echo Cifrado : !cifrado!
pause >nul
endlocal
%e% Bye..
exit

:ini
cls
set pal=
set cifrado=
set base64=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
set p1=0
call:base64
del %temp%\enc.vbs
del ascii.txt
goto:EOF

:base64
cls
if %p1% EQU 3 (set p=&&set p1=0) else (set /a p1+=1&&set p=.%p%)
echo Codificando%p%
if not defined str goto:EOF
set chr3=%str:~0,3%
set code=
set sw=0
call:contar_chr "%chr3%"
if [%count%] LSS [3] (
  if [%count%] EQU [2] (set sw=2)
  if [%count%] EQU [1] (set sw=1)
)
call:ascii "%chr3%"
if exist ascii.txt (
for /f "tokens=*" %%a in (ascii.txt) do (
  for %%b in (%%a) do call:dec_bin %%b
  call:contar_bits !code!
  call:codificar
  )
)
set str=%str:~3%
goto base64

:codificar
if not defined code (
   if ["%sw%"] EQU ["2"] (set cifrado=%cifrado%=)
   if ["%sw%"] EQU ["1"] (set cifrado=%cifrado%==)
   goto:EOF
)
set dig6=%code:~0,6%
set n=%dig6%
set c=0
set s=0
call:bin_dec
call set wzr=%%base64:~%s%,1%%
set cifrado=%cifrado%%wzr%
set code=%code:~6%
goto codificar

:dec_bin
set n=%1
set cad=
set c=0
call:binario
call:bits 8 %cad%
set code=%code%%cad%
goto:EOF

:bits
set digs=0
set long=%2
call:dim
:dimensionar
if [%digs%] LSS [%1] (set cad=0%cad%&& set /a digs+=1&&goto dimensionar) else (goto:EOF)

:dim
if not defined long goto:EOF
set long=%long:~1%
set /a digs+=1
goto dim

:bin_dec
if not defined n goto:EOF
call set bit=%%n:~-1%%
if [%bit%] EQU [1] call:sumar
set /a c+=1
set n=%n:~,-1%
goto bin_dec

:sumar
set /a d="1<<c"
set /a s+=d
goto:EOF

:binario
set /a c+=1
set /a dig=n%%2
set /a n/=2
set cad=%dig%%cad%
if %n% EQU 0 (if %c% EQU 1 (set cad=0%cad% & goto:EOF))
if %n% EQU 0 (goto:EOF) else (goto binario)

:contar_chr
set chrs=%~1
set count=0
:count_chrs
if not defined chrs goto:EOF
set chrs=%chrs:~1%
set /a count+=1
goto count_chrs

:contar_bits
set tbits=%1
set count=0
call:count_bits
if [!sw!] GTR [0] call:rellenar
goto:EOF

:rellenar
if [!sw!] LSS [2] (
if !count! LSS 12 (
set code=%code%0
set /a count+=1
goto rellenar)
)
if [!sw!] GTR [1] (
if !count! LSS 18 (
set code=%code%0
set /a count+=1
goto rellenar)
)
goto:EOF

:count_bits
if not defined tbits goto:EOF
set tbits=!tbits:~1!
set /a count+=1
goto count_bits

:ascii
echo Function enc (cad)>%temp%\enc.vbs
echo for i=1 to Len (cad)>>%temp%\enc.vbs
echo enc=enc ^& Asc(Mid(cad,i,1)) ^& " ">>%temp%\enc.vbs
echo Next>>%temp%\enc.vbs
echo End Function>>%temp%\enc.vbs
echo Set shell = CreateObject("Scripting.FileSystemObject")>>%temp%\enc.vbs
echo set b=shell.CreateTextFile("ascii.txt")>>%temp%\enc.vbs
echo b.write enc("%~1")>>%temp%\enc.vbs
echo b.close>>%temp%\enc.vbs
start %temp%\enc.vbs
ping 127.0.0.1 -n 1 >nul
goto:EOF

:help
%e%.
%e%.
%e%            /\  \                     /\__\         /\  \         /\  \   
%e%           _\:\  \       ___         /::^|  ^|       /::\  \       /::\  \   
%e%          /\ \:\  \     /\__\       /:/:^|  ^|      /:/\:\  \     /:/\:\__\ 
%e%         _\:\ \:\  \   /:/__/      /:/^|:^|  ^|__   /:/ /::\  \   /:/ /:/  / 
%e%        /\ \:\ \:\__\ /::\  \     /:/ ^|:^| /\__\ /:/_/:/\:\__\ /:/_/:/__/___
%e%        \:\ \:\/:/  / \/\:\  \__  \/__^|:^|/:/  / \:\/:/  \/__/ \:\/:::::/  /
%e%         \:\ \::/  /     \:\/\__\     ^|:/:/  /   \::/__/       \::/~~/~~~~
%e%          \:\/:/  /       \::/  /     ^|::/  /     \:\  \        \:\~~\     
%e%           \::/  /        /:/  /      ^|:/  /       \:\__\        \:\__\   
%e%            \/__/         \/__/       ^|/__/         \/__/         \/__/   
%e%.                                               
%e%                                      _____   
%e%                                     /::\  \   
%e%                                    /:/\:\  \ 
%e%                                   /:/  \:\__\
%e%                                  /:/__/ \:^|__^|
%e%                                  \:\  \ /:/  /
%e%                                   \:\  /:/  /
%e%                                    \:\/:/  / 
%e%                                     \::/  /   
%e%                                      \/__/   
ping 127.0.0.1 -n 3 >nul
%e%.
%e%.
%e%.
%e% Ej:%~nx0  %~1
%e%.
%e%.
%e% -c "cadena a cifrar" Con comillas si hay espacio
%e% -f "Archivo a cifrar" "Archivo cifrado"
%e%.
%e%.
%e%.
%e%.
%e%.
%e%.
%e%.
%e%.
%e% The magic.
exit


Suele  tener  un  error  al  no  poner  las  comillas  " "  cuando  existe  un  espacion  en  el  -c resolverlo  y  poner  la  condicion  correcta  sera  (primer reto)

Como  veran   falta   la  operacion   -f   para  cifrar  todo  un  archivo  y  rederigir  el   resultado  en  otro  archivo...   no  es  muy  complicado..  (segundo  reto)

el  mayor  Reto   para  uds..   sera  hacer   en  base  por  supuesto  a las  funciones  q  utilizo...,  o  si  kieren   utilizan  sus  propias  funciones.... 

lograr  el  Decodificador  para  la  Base64 (reto  final)


mis  respetos   akellos   q lo  logren...,  dare  todo  el  tiempo  necesario   para q  lo  logren   dado  el  caso  q   nadie   llege  hacerlo, aunke  no kreo q  suceda ::),  publicare   el   Decodificador...  ::)


salu2-->

carlitos.java

#1
Me tomó un tiempo hacerlo funcionar, primero tuve que habilitar window scripting host, editar esto
%temp%\enc.vbs
por
wscript.exe enc.vbs

primero porque %temp% contiene espacios, y además porque el start me abría otra ventana de cmd.


:ascii
echo Function enc (cad)>%temp%\enc.vbs
echo for i=1 to Len (cad)>>%temp%\enc.vbs
echo enc=enc ^& Asc(Mid(cad,i,1)) ^& " ">>%temp%\enc.vbs
echo Next>>%temp%\enc.vbs
echo End Function>>%temp%\enc.vbs
echo Set shell = CreateObject("Scripting.FileSystemObject")>>%temp%\enc.vbs
echo set b=shell.CreateTextFile("ascii.txt")>>%temp%\enc.vbs
echo b.write enc("%~1")>>%temp%\enc.vbs
echo b.close>>%temp%\enc.vbs


por


:ascii
echo Function enc (cad)>enc.vbs
echo for i=1 to Len (cad)>>enc.vbs
echo enc=enc ^& Asc(Mid(cad,i,1)) ^& " ">>enc.vbs
echo Next>>enc.vbs
echo End Function>>enc.vbs
echo Set shell = CreateObject("Scripting.FileSystemObject")>>enc.vbs
echo set b=shell.CreateTextFile("ascii.txt")>>enc.vbs
echo b.write enc("%~1")>>enc.vbs
echo b.close>>enc.vbs


sobre lo de no colocar comillas, se colocan comillas hasta en nombres de archivos con espacios para indicar que el espacio es parte de un argumento y no un separador de otro.



wizard_0

Tenes razon, pero la  idea  es   obligar  al  usuario  q  coloke  las  ""  no una si no las  2  "s t r i n g"  de  lo contrario  no  llege  a cifrar  nada. pero no  es  nada  complicado...   

lo  de  -f   tampoco  ,son  2 o 3 condiciones  +  para  estos  primeros  desafios..

pero  yo  kreo  q  ya  lo  has  probado...

ojala  llegen a  entran   mas   al  reto..  mi  interesa  saber  kienes  son  capaces  de lograrlo.



salu2-->