Codificador e decodificador Base45

Converta texto, bytes em hex ou arquivos para Base45 e vice-versa. O Base45 usa os 45 caracteres do modo alfanumérico do QR code, para que dados binários caibam em QR codes com pouco acréscimo de tamanho.

Funciona inteiramente no seu navegador. Nada é enviado.

Como usar

  1. Escolha Codificar para transformar texto em Base45 ou Decodificar para transformar Base45 de volta em texto ou bytes.
  2. Digite ou cole a entrada, ou abra um arquivo. Mantenha todos os espaços: eles fazem parte do alfabeto.
  3. Ao decodificar dados binários, como o conteúdo de um certificado, mude a saída para Hex.
  4. Copie o resultado ou baixe-o como arquivo.

O que é Base45?

O Base45 é definido na RFC 9285. Seu alfabeto é formado pelos dígitos 0-9, pelas letras maiúsculas A-Z e por nove símbolos: o espaço e $ % * + - . / :. São exatamente os 45 caracteres que um QR code consegue armazenar no seu modo alfanumérico compacto. Observe que o espaço é um caractere real do alfabeto, não um separador.

O codificador lê a entrada de dois em dois bytes, interpreta cada par como um número de 0 a 65535 e escreve esse número como três dígitos Base45, começando pelo dígito menos significativo. Um byte isolado no final vira dois caracteres. Como texto, o resultado tem 1,5 vez o tamanho da entrada, mais do que o Base64.

Por que o Base45 combina com QR codes

No modo alfanumérico, um QR code guarda dois caracteres em 11 bits. O Base64 não pode usar esse modo porque precisa de letras minúsculas, então recorre ao modo byte, com 8 bits por caractere, o que dá cerca de 10,7 bits para cada byte de dados. O Base45 precisa de apenas 8,25 bits por byte no modo alfanumérico, então os mesmos dados cabem em um QR code menor e mais fácil de escanear.

Ao decodificar, mantenha os espaços exatamente como estão; apenas as quebras de linha são ignoradas. Letras minúsculas não fazem parte do alfabeto e são informadas como inválidas.

Como decodificar Certificados Digitais COVID da UE

Os QR codes dos Certificados Digitais COVID da UE contêm um texto que começa com HC1:. O restante é Base45: os dados do certificado são codificados em CBOR, assinados com COSE, compactados com zlib e só então codificados em Base45. Para ver o conteúdo:

  1. Remova o prefixo HC1:. Seus quatro caracteres são Base45 válido, então mantê-los produz bytes errados.
  2. Decodifique o restante aqui com saída em Hex. Dados zlib geralmente começam com o byte 78.
  3. Descompacte os bytes com zlib e analise o CBOR com outra ferramenta.

Esta ferramenta cuida apenas da etapa Base45. Ela não descompacta os dados, não os analisa e não verifica a assinatura.

Base45 no código

# Python (pip install base45)
import base45
base45.b45encode(b'AB')     # exemplo da RFC 9285: BB8
base45.b45decode('BB8')     # b'AB'

Especificação

Alfabeto0-9 A-Z espaço $ % * + - . / :
Tamanho da saída3 caracteres a cada 2 bytes (150%)
PreenchimentoNenhum
PadrãoRFC 9285
Diferencia maiúsculas e minúsculasSim

Exemplos

Entrada (UTF-8)Saída
Hello, World!%69 VDK2E:3404ESVDX0
Base64.isSH8LQEG%61*5P2
你好C-SEFK*.K

Perguntas frequentes

Por que a saída Base45 contém espaços?

O espaço é um dos 45 caracteres do alfabeto, então ele carrega dados. Não remova nem junte espaços em um texto Base45, ou a decodificação vai falhar ou gerar bytes errados.

Como decodificar uma string HC1:?

Remova o prefixo HC1:, decodifique o restante com saída em Hex, depois descompacte o resultado com zlib e leia os dados CBOR com uma ferramenta separada. Esta ferramenta realiza apenas a etapa Base45.

O Base45 diferencia maiúsculas de minúsculas?

Sim. Somente as letras maiúsculas pertencem ao alfabeto, porque o modo alfanumérico do QR code não tem minúsculas. Entradas em minúsculas são informadas como inválidas, junto com a sua posição.

O Base45 é mais compacto que o Base64?

Como texto puro, não: o Base45 tem 1,5 vez o tamanho da entrada, e o Base64, cerca de 1,33 vez. Dentro de um QR code, sim, porque o Base45 pode usar o modo alfanumérico, que é mais denso.