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:
base64viene 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ón | Qué hace | Ejemplo |
|---|---|---|
| sin opciones | Codifica | echo -n 'Guayabo' | base64 |
-d | Decodifica (decode) | base64 -d nota.txt |
-w 0 | No corta la salida en líneas de 76 | base64 -w 0 archivo.bin |
$ echo -n 'Guayabo' | base64
R3VheWFibw==
$ echo 'R3VheWFibw==' | base64 -d
GuayaboSin 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ón | Qué hace | Ejemplo |
|---|---|---|
| sin opciones | Desplazamiento, hex y texto | xxd pedido.bin |
-p | Solo hex, en una tira | xxd -p pedido.bin |
-r -p | De hex a bytes | echo 4775 | xxd -r -p |
$ echo -n 'Guayabo' | xxd
00000000: 4775 6179 6162 6f GuayaboXOR 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:
| Regla | Consecuencia |
|---|---|
a ^ 0 = a | Los bytes nulos del original dejan la clave a la vista |
a ^ a = 0 | Dos cifrados con la misma clave se comparan sin conocerla |
a ^ b ^ b = a | Cifrar y descifrar son la misma operación |
cifrado ^ claro = clave | Un 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ón | Para qué | Parámetro que importa |
|---|---|---|
| From Base64 | Quitar base64 | Alphabet: estándar |
| From Hex | Quitar hex | Delimiter: Auto |
| ROT13 | Rotar letras | Amount: 13 |
| XOR | Aplicar una clave | Key y su tipo: UTF8, Hex o Base64 |
| XOR Brute Force | Probar todas las claves de 1 byte | Crib: 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 inputFalta 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.