Muito bom, principalmente por reforçar que Base64 não é criptografia (já vi muita gente que acha que é).
Complementando, um dos primeiros usos da Base64 foi em sistemas de email, mais precisamente no protocolo PEM (Privacy-enhanced Eletronic Mail). Isso porque só eram permitidos caracteres ASCII, e a conversão para Base64 permitia que qualquer tipo de conteúdo binário fosse enviado (por exemplo, em anexos do email).
Enfim, Base64 é uma forma genérica de converter quaisquer bytes em um subconjunto de ASCII, permitindo a transmissão dos dados sem perda ou corrupção destes (assumindo que o sistema que vai processar tais dados não tenha suporte adequado a caracteres não-ASCII, pois caso tenha, a conversão seria desnecessária).
Vale lembrar também que, por causa do algoritmo (no qual 3 bytes são convertidos em 4 bytes), o tamanho do conteúdo em Base64 será 1,333… vezes maior que o original.
Por fim, existem algumas variações do formato, nas quais os caracteres +
e /
são substituídos por outros (por exemplo, por -
, _
ou ,
), além do =
no fim ser opcional. Em outros há uma quebra de linha obrigatória a cada 64 caracteres (como é o caso do PEM).
E como curiosidade, existem vários formatos que usam uma ideia similar (limitam a saída a um conjunto fixo de valores), como o Base16, Base32, Base85, entre outros.
Quanto aos exemplos, sei que a ideia foi ser didático e usar ASCII para simplificar, mas vale lembrar que a mesma string pode resultar em bytes diferentes, dependendo do encoding usado. Segue um exemplo em Python para ilustrar:
from base64 import b64encode
s = 'abc'
for enc in [ 'ascii', 'utf-8', 'utf-16', 'utf-32']:
print(f'{enc:7}= {b64encode(s.encode(enc))}')
Primeiro eu converti os caracteres da string para um encoding específico, e depois os bytes resultantes são passados para b64encode
, que faz a codificação para Base64. O resultado é:
ascii = b'YWJj'
utf-8 = b'YWJj'
utf-16 = b'//5hAGIAYwA='
utf-32 = b'//4AAGEAAABiAAAAYwAAAA=='
Isso porque, em cada encoding, um mesmo caractere pode resultar em bytes diferentes. E como Base64 codifica bytes (e não caracteres), o resultado pode ser diferente, dependendo do encoding usado.
Essa é uma distinção importante: Base64 converte bytes, e só. O que esses bytes significam é indiferente para o algoritmo (se eram caracteres, uma imagem, vídeo, ou se foram gerados aleatoriamente, não importa).
Quem está convertendo para Base64 (e também quem está convertendo de volta aos bytes originais) é que deve saber o que são esses bytes (se é um texto em ASCII ou em algum outro encoding, por exemplo).