Esquema de Codificação Base58 - Bóson Treinamentos em Ciência e Tecnologia
Início » Segurança » Esquema de Codificação Base58
Postado Em 24/11/2017 [data do post] por Fábio dos Reis [autor do post] em Segurança [categoria do post]
O que é o Base58
Para representar números grandes (longos) de forma sucinta e compacta, usando pouco símbolos, os sistemas de computador utilizam representações alfanuméricas com uma base numérica maior do que a base 10. Por exemplo, o sistema tradicional de representação numérica que usamos no dia-a-dia é o sistema base 10, que utiliza os numerais de 0 a 9 para representar todos os números.
Porém, é muito comum em programação de computadores que endereços de memória sejam representados numericamente, e para isso geralmente usamos o sistema de numeração hexadecimal (base 16), que contém os numerais de 0 a 9, mais as "letras" de A a F, que representam os valores numéricos de 10 a 15. Assim, um número representado no sistema hexadecimal é mais curto do que sua representação equivalente em decimal, facilitando as tarefas de digitação, representação e memorização (se necessária).
Podemos compactar ainda mais a representação de strings de caracteres e valores numéricos usando sistemas como o Base64, que utiliza as 26 letras do alfabeto latino minúsculas, as 26 letras maiúsculas, 10 numerais (0 a 9) e mais dois caracteres especiais, como "+" e "/" para a transmissão de dados binários em mídias baseadas em texto, como e-mails. O sistema Base64 é muito utilizado para adicionar anexos binários em e-mails.
Já o sistema Base58 é um formato de codificação binária baseado em texto desenvolvido para uso em aplicações de criptomoedas, como o Bitcoin. Ele oferece um balanço entre a representação compacta, facilidade de leitura, detecção e prevenção de erros. O Base58 é um subconjunto do sistema Base64, utilizando as letras do alfabeto maiúsculas e minúsculas, números, e omitindo alguns caracteres que muitas vezes são confundidos com outros caracteres, e que podem parecer idênticos dependendo da fonte usada na representação do texto.
No caso do Base58, os caracteres que não são utilizados são o 0 (zero), O (letra o maiúscula), I (letra i maiúscula), l (letra L minúscula) e os símbolos "+" e "/".
Abaixo temos o alfabeto Base58 completo:
O Base58 foi projetado especificamente para que seja possível humanos entrarem com dados manualmente, ou ainda copiá-los de alguma fonte visualmente.
As principais aplicações do Base58 são a criação de endereços de Bitcoin, endereços de Ripple (outra criptomoeda) e URLs encurtadas para o Flickr, entre outras.
O Base58Check é um formato de codificação Base58 que, além de codificar os dados, também registra o tipo dos dados na string formada, e inclui detecção de erros nos últimos caracteres da codificação.
O checksum (soma de verificação para detecção de erros) consiste em quatro bytes adicionais concatenados no final dos dados que são codificados. O checksum é derivado de um hash dos dados codificados, e assim pode ser utilizado para detectar e prevenir modificação dos dados e erros de digitação.
Quando um software recebe uma string codificada com Base58Check, ele calcula o checksum dos dados e o compara com o checksum incluído no código e si. Se os valores não baterem, um ero ocorreu na transmissão dos dados e o dado é considerado inválido. Desta forma, por exemplo, evita-se que um endereço Bitcoin digitado erroneamente seja aceito por um software de carteira como um destino válido de fundos, um erro que resultaria em perda do dinheiro transferido.
Para converter dados brutos em formato Base58Check, primeiramente adicionamos um prefixo ao dado, chamado de "Byte de Versão", que serve para identificar com facilidade o tipo de dado que está sendo codificado. Por exemplo, para um endereço de bitcoin o prefixo será zero, enquanto o prefixo usado para codificar uma chave privada será o número 128 (em hexadecimal, 0x80).
Após adicionar o prefixo, é computado um hash duplo do dado, usando o algoritmo SHA256 duas vezes, como segue:
soma de verificação = SHA256(Sha256(prefixo + dado))
O resultado será uma string de 32 bytes, dos quais usa-se apenas os quatro primeiros. Esses quatro bytes servem como código de verificação de erros (não de correção!), e é o que chamamos de "Checksum". Esse valor é concatenado o final da string de dados a ser transmitida.
Assim, temos no final ma string composta por um prefixo, dados e um checksum. Esse conjunto é então codificado usando o formato Base58 que vimos na seção anterior.
Uma das principais aplicações do Base58Check é a codificação de dados em bitcoin para apresentação ao usuário, pois os dados se tornam compactos, fáceis de ler e de detectar erros. Os endereços de bitcoin codificados desta forma sempre iniciam com o caractere 1 (um).
Como exemplo, veja o endereço público para contribuições de bitcoin para a Bóson Treinamentos (caso queira contribuir com qualquer valor, fique à vontade!):
Como esperado, o endereço (que está codificado) se inicia com o valor 1.
É isso aí! No próximo tutorial vamos continuar explorando as tecnologias por trás das criptomoedas. Até mais!