Cómo codificar y decodificar Base45
- Escribe o pega texto en Entrada · Texto. La cadena Base45 aparece en Salida · Base45 (RFC 9285).
- Para datos binarios, como bytes comprimidos, pon antes De en Hex o Base64.
- Para decodificar, haz clic en Base45 (RFC 9285) → Texto en el selector de dirección y pega la cadena. Elige Hex o Base64 en A si el resultado es binario, como ocurre con los certificados sanitarios.
- Copiar salida conserva los espacios. Guardar bytes descarga los bytes decodificados como archivo.
Cómo funciona Base45
RFC 9285 toma la entrada de dos en dos bytes. Cada par es un número n de 0 a 65535, que se escribe como tres dígitos en base 45 c, d, e con n = c + d × 45 + e × 45², empezando por el menos significativo. Un último byte suelto se convierte en dos dígitos. El alfabeto es el juego alfanumérico de los códigos QR, en orden:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:
Los ejemplos de la RFC, todos reproducidos con esta herramienta:
| Entrada | Base45 |
|---|---|
AB | BB8 |
Hello!! | %69 VD92EX0 |
base-45 | UJCLQE7W581 |
ietf! | QED8WEX0 |
Al decodificar se comprueban dos cosas que un decodificador permisivo podría pasar por alto: una longitud de 3n + 1 no puede salir de ninguna entrada, y un grupo mayor que 65535 (como GGW o ZZZ) está fuera de rango. Ambos casos dan error.
Por qué Base45 encaja con los códigos QR
Sobre el papel, Base45 parece un derroche: 3 caracteres por cada 2 bytes es un 50 % más de tamaño, más que el 33 % de Base64. La diferencia está en cómo guardan el texto los códigos QR. En modo alfanumérico, un código QR empaqueta dos de estos 45 caracteres en 11 bits. Así, tres caracteres Base45 cuestan 16,5 bits por 16 bits de datos, alrededor de un 3 % más.
Base64 no puede usar el modo alfanumérico porque necesita letras minúsculas. Tiene que ir en modo byte, a 8 bits por carácter, lo que supone un 33 % más dentro del código QR. Con los mismos datos, el código QR en Base45 es más pequeño o cabe más información.
Decodificar un Certificado COVID Digital de la UE (HC1:)
El código QR del Certificado COVID Digital de la UE contiene una cadena que empieza por HC1:. La carga útil se construye por capas, y esta página se ocupa de una de ellas:
- Quita el prefijo
HC1:.H,C,1y:son caracteres Base45 válidos, así que si dejas el prefijo se decodifica como datos y estropea todo lo que viene después. - Decodifica el Base45 del resto aquí, con A en Base64.
- Descomprime el resultado. Son datos zlib, que empiezan por el byte
78(eJoeNen Base64). Pega el Base64 en el decodificador gzip y zlib. - Analiza el CBOR. Los bytes descomprimidos son una estructura COSE_Sign1 en CBOR: una cabecera, la carga útil con los campos del certificado y una firma. Eso requiere un decodificador CBOR, que este sitio no tiene.
Decodificar muestra el contenido, pero no verifica la firma. Para comprobar que un certificado es auténtico hacen falta la clave pública del país emisor y un verificador COSE.
Base45 en Python
Python no tiene un módulo Base45 en la biblioteca estándar. El codificador sigue la RFC al pie de la letra:
ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:"
def b45encode(data: bytes) -> str:
out = []
for i in range(0, len(data) - 1, 2):
n = data[i] * 256 + data[i + 1]
c, n = n % 45, n // 45
d, e = n % 45, n // 45
out += ALPHABET[c], ALPHABET[d], ALPHABET[e]
if len(data) % 2:
c, d = data[-1] % 45, data[-1] // 45
out += ALPHABET[c], ALPHABET[d]
return "".join(out)
b45encode(b"ietf!") # 'QED8WEX0'
El paquete base45 de PyPI ofrece ambas direcciones. Para más manejo de bytes en Python, consulta la página de Python.
Preguntas frecuentes
¿Por qué la salida Base45 tiene espacios?
El espacio es uno de los 45 caracteres del juego alfanumérico de QR, así que en Base45 es un dígito normal con el valor 36. Hello!! se codifica como %69 VD92EX0. Conserva los espacios al copiar y no dejes que un formulario o una shell los recorten.
¿Puedo decodificar aquí un Certificado COVID Digital de la UE?
En parte. Esta página hace el paso de Base45. Después, los datos son CBOR comprimido con zlib dentro de una estructura COSE firmada, que necesita un paso de descompresión y un decodificador CBOR; los pasos se detallan en esta página.
¿Se puede poner Base45 en una URL sin problemas?
No. El espacio, %, + y / forman parte del alfabeto y todos significan algo en las URLs. Aplica codificación por porcentajes a la cadena o usa Base64URL para URLs.
¿Por qué se rechaza mi cadena Base45?
Un Base45 válido tiene una longitud de 3n o 3n + 2 caracteres, y cada grupo de 3 caracteres debe valer como máximo 65535. Una longitud de 3n + 1, o un grupo como GGW, es un error. Una causa habitual es haber dejado el prefijo HC1:.