Saltar al contenido
Lectura9 minPreview

Herramientas: base64, xxd, XOR y CyberChef

Para la cripto de nivel inicial me alcanzan base64, xxd, el operador XOR y CyberChef. Python cubre todo lo anterior si está en Windows.

Ficha de base64

  • Nombre: base64 viene de base 64: usa 64 símbolos imprimibles para representar cualquier byte.
  • Qué hace: codifica y decodifica, sin proteger nada. Viene en GNU coreutils; en Windows use CyberChef o Python.
base64 [-d] [-w COLUMNAS] [ARCHIVO]
OpciónQué haceEjemplo
sin opcionesCodificaecho -n 'Guayabo' | base64
-dDecodifica (decode)base64 -d nota.txt
-w 0No corta la salida en líneas de 76base64 -w 0 archivo.bin
$ echo -n 'Guayabo' | base64
R3VheWFibw==
$ echo 'R3VheWFibw==' | base64 -d
Guayabo

Sin el -n de echo se codifica también el salto de línea y el resultado cambia.

Ficha de xxd

xxd (de hex dump, volcado hexadecimal) muestra los bytes reales cuando algo "no se ve".

xxd [-p] [-r] [ARCHIVO]
OpciónQué haceEjemplo
sin opcionesDesplazamiento, hex y textoxxd pedido.bin
-pSolo hex, en una tiraxxd -p pedido.bin
-r -pDe hex a bytesecho 4775 | xxd -r -p
$ echo -n 'Guayabo' | xxd
00000000: 4775 6179 6162 6f                        Guayabo

XOR en cuatro reglas

XOR (exclusive or, "o exclusivo") compara bit a bit y da 1 cuando los bits son distintos. En Python es ^. El reto entero sale de estas reglas:

ReglaConsecuencia
a ^ 0 = aLos bytes nulos del original dejan la clave a la vista
a ^ a = 0Dos cifrados con la misma clave se comparan sin conocerla
a ^ b ^ b = aCifrar y descifrar son la misma operación
cifrado ^ claro = claveUn pedazo del original da la clave: ataque de texto conocido
>>> hex(ord("G") ^ ord("K"))    # cifrar G con la clave K
'0xc'
>>> chr(0x0c ^ ord("K"))        # descifrar con la misma clave
'G'
>>> chr(0x0c ^ ord("G"))        # cifrado XOR claro: sale la clave
'K'

Si la clave es más corta que el mensaje, se repite. Esa repetición es lo que se rompe.

CyberChef: las operaciones que uso

Las operaciones van a la Recipe y corren de arriba abajo.

OperaciónPara quéParámetro que importa
From Base64Quitar base64Alphabet: estándar
From HexQuitar hexDelimiter: Auto
ROT13Rotar letrasAmount: 13
XORAplicar una claveKey y su tipo: UTF8, Hex o Base64
XOR Brute ForceProbar todas las claves de 1 byteCrib: un trozo de texto que espera ver

El error que más veo: escribir la clave como texto y dejarla en modo Hex. La salida sale basura, sin aviso.

Errores frecuentes

$ echo 'R3VheWFibw=' | base64 -d
Guayabobase64: invalid input

Falta un =. base64 imprime lo que pudo y se queja al final; revise que el largo sea múltiplo de 4. En Python, base64.b64decode falla con binascii.Error: Incorrect padding por la misma razón.