CIÊNCIAS DA COMPUTAÇÃO
01/11/2022
Estudo de possibilidades com criptografia
O que é binário?
Para começarmos a falar sobre o assunto deste artigo, é importante entender o que é binário. A definição da palavra binário é: indica algo que tem duas unidades ou algo que é composto por dois elementos de informação. Os números binários podem ser apenas dois, 0 ou 1. Ele está totalmente relacionado à informática, sendo a linguagem que determina as instruções para um computador.
A imagem que você está vendo em sua tela nesse exato momento, seu navegador, este texto, tudo está funcionando do jeito que está porque, essencialmente, há impulsos elétricos passando pelos componentes eletrônicos do seu dispositivo e tudo é formado a partir desse simples conceito.
O computador é um dispositivo eletrônico, com circuitos eletrônicos que, por sua vez, podem passar eletricidade ou não. Em teoria, a passagem de eletricidade representa 1 e a não passagem é representada pelo 0. Mas como um circuito pode detectar a não passagem de eletricidade? Para isso, geralmente haverá alguma tensão alta para representar o 1 e alguma tensão mais baixa para representar o 0. Resumindo, 0s e 1s, no computador, são apenas altas e baixas tensões que passam pelo circuito. Nos computadores, só podemos representar tudo desta forma. Letras, números, imagens... tudo o que você utiliza em um computador se resume à zeros e uns.
Como ler um binário?
Nosso sistema decimal, ou seja, os números no qual usamos no cotidiano para contar dinheiro, tempo, unidades, etc. é de base 10, o que significa que cada dígito em cada posição representará um valor entre 10 possibilidades (0, 1, 2, 3, 4, 5, 6, 7, 8 ou 9). Ele é um sistema posicional, ou seja, a posição do algarismo no número modifica o seu valor. Por exemplo: o número 1 vale uma unidade, mas se movermos o 1 para a casa da dezena, agora temos 10 unidades. Cada vez que eu movo este 1 para a esquerda, seu valor dobra em relação ao anterior (1, 10, 100, 1000...), o que nos dá uma relação de potência.
Então, a partir dessa análise, para sabermos por exemplo quanto é 125 na base decimal, fazemos a seguinte conta: multiplicamos cada algarismo por 10 elevado pela sua respectiva posição (n x 10p), na qual começa pelo zero na primeira casa da direita (casa da unidade) e aumenta para esquerda.
125 = (1 x 102) + (2 x 101) + (5 x 100)
125 = 100 + 20 + 5
125 = 125
Sim, isso foi redundante, eu converti um número já em base decimal para decimal novamente, mas foi para te mostrar a lógica. Agora, vamos voltar ao binário.
O número 10 em binário corresponde ao número 2 na base decimal. Porque? Bom, no binário não podemos usar outros dígitos além do 0 e 1, então, como representariamos nosso número 2 em forma binária? Lembra do que falei sobre a posição do algarismo modificar seu valor? No binário não é diferente.
O número 1 em binário representa o 1 em decimal, mas se quisermos representar o número 2, jogamos este 1 para esquerda, o que resultará no binário 10. Cada vez que você passar o “1“ para esquerda, este número dobra o valor que ele teria na casa anterior. Ou seja:
0001 em binário vale 1
0010 em binário vale 2
0100 em binário vale 4
1000 em binário vale 8
1111 em binário vale 1 + 2 + 4 + 8 = 15
Obs.: os zeros à esquerda não influenciam em nada, apenas acrescentei para mostrar de forma melhor.
Para representar o número 3 usariamos o binário 11 (2 + 1). Para o número 4 usariamos o binário 100 (4). Para o número 5 usariamos o binário 101 (4 + 1), e assim em diante.
Se ficou confuso, veja a seguinte tabela:
Para calcular qualquer binário, podemos simplesmente somar todos os valores laranjas que estejam acima de um número “1“, ignorando os 0s. No caso da imagem, a soma nos dará 8 + 2 + 1 = 11, ou seja, o número binário visto na imagem (1011) corresponde ao número 11 na base decimal.
No fim, para calcularmos o valor decimal de um número em binário, fazemos a seguinte conta: número binário multiplicado por 2 elevado à posição (binário x 2p), onde a posição zero é a primeira casa da direita e aumenta para esquerda. Se você reparou, é a mesma conta para o decimal, o que muda é a base que estamos exponenciando. Se você precisasse calcular um binário maior, como por exemplo, com 9 bits, você faria a tabela da imagem com mais um espaço para esquerda (pois nela só temos 8 bits) e dobraria o valor anterior, no caso, o 128, resultando em 256, e assim em diante. Veja estes dois exercícios:
Converta o binário 10 para base decimal:
(1 x 21) + (0 x 20)
2 + 0 = 2
Converta 101 para base decimal:
(1 x 22) + (0 x 21) + (1 x 20)
4 + 0 + 1 = 5
O que é criptografia?
A criptografia é uma técnica que visa proteger uma informação de modo que apenas o emissor e o receptor consigam compreendê-la. É muito utilizada no meio da tecnologia, como na troca de mensagens, em pagamentos online, armazenamento de senhas...
O princípio básico da criptografia é permitir que duas pessoas compartilhem secretamente mensagens entre si, sem que elas sejam compreendidas por terceiros.
Um exemplo muito básico de criptografia seria, por exemplo, girar as palavras de um texto no alfabeto. Se eu digo para girar o texto 1 vez, o “a“ se transformaria no “b“, que é sua próxima letra no alfabeto.
Seguindo essa mesma lógica, ao girar 2 vezes o texto “oi“, teriamos o texto criptografado “qk“. Você poderia combinar com um amigo de girarem as palavras uma determinada quantidade de vezes e passar a mandar textos criptografados a ele, que saberia ler a mensagem original fazendo o processo inverso uma vez que você tenha dito quantas vezes o texto foi girado. Mas esta é uma forma muito simples de se criptografar algo, uma vez que o tempo que alguém levaria para descriptografar o texto girando todas as vezes possíveis não seria tão alto.
Pensando nisto, para uso prático, temos algoritmos de criptografia complexos e confiáveis, um deles é o SHA-256 (Secure Hash Algorithm), projetado pela NSA (Agência de Segurança Nacional dos EUA). Ele é amplamente usado nos dias em que escrevo este artigo, como por exemplo: pelo Bitcoin, para garantir a integridade das informações armazenadas em um bloco da blockchain.
O algoritmo SHA-256 gera um hash de 256 bits, assim como seu nome sugere. O resultado é sempre uma sequência de 64 letras e números, ou seja, não importa se você criptografe uma única letra ou um texto com mais de 100 mil palavras, o hash gerado pelo SHA-256 sempre terá 64 letras e números. Um “oi“ criptografado em SHA-256, por exemplo, resulta no seguinte hash: 87f633634cc4b02f628685651f0a29b7bfa22a0bd841f725c6772dd00a58d489
Para cada unidade desta hash, podemos ter qualquer número entre 0 e 9 ou também letras de “a“ até “f“, totalizando 16 possibilidades, chamamos este sistema de hexadecimal pois representa os números em base 16, portanto, emprega 16 símbolos. Em binário, podemos representar qualquer número de 0 a 15, ou seja, 16 possibilidades de números, com apenas 4 bits (1111 é igual a 15). Agora faça as contas: se o SHA-256 fornece um hash com 64 palavras onde cada palavra pode ser representada por 4 bits, 4 x 64 = 256 bits.
Sabendo disso, podemos calcular a possibilidade de tentar todas as combinações possíveis desta hash e descobrir o conteúdo original.
Combinações possíveis
Vamos supor que o hash da minha senha tenha gerado apenas 1 bit, se o bit pode assumir duas formas (0 ou 1), quantas possibilidades alguém teria de quebrar minha senha? 2 possibilidades, correto? A pessoa chuta o número 0, e caso não tenha funcionado, entra com o número 1.
Agora, vamos dobrar a quantidade de bits. Usando a mesma lógica citada acima, teriamos 4 possibilidades: 00, 01, 10, 11.
Se formos para 3 bits, dobrariamos a possibilidade anterior, totalizando 8 possibilidades: 000, 001, 010, 011, 100, 101, 110, 111.
Analisando esse padrão, temos que o cálculo para saber o número de possibilidades é: 2 elevado à quantidade de bits.
Relembrando o que foi dito no começo deste artigo, o número que elevamos é o 2 porque a base do bit é binária (base 2), tendo apenas 2 opções de números. Caso a base fosse decimal (números de 0 a 9), teriamos 10 elevado à quantidade de números. Por exemplo, qual seria a chance de quebrar uma senha que contenha apenas um número decimal? Pode ser de 0 a 9, o que daria 10 possibilidades, e então cairiamos na mesma lógica anteriormente dos bits. Com dois números decimais, a conta seria 102, o que nos daria 100 possibilidades.
Como no SHA-256 temos 256 bits, cada um podendo assumir dois valores (0 ou 1), a conta seria 2256, o que nos daria um número com impressionantes setenta e sete casas à direita.
Imaginemos que um dos computadores mais rápidos do mundo, o Frontier, capaz de fazer 1.1 quintilhão de operações por segundo, em breve esteja disponível para os 8 bilhões de pessoas do planeta. Imaginemos também que todos esses habitantes se juntem para tentar varrer todas as possibilidades de uma chave criptografada gerada pelo SHA-256. Em quanto tempo varreremos todas as possibilidades de combinação de bits dessa chave?
Fazendo as contas: 8 bilhões de computadores com poder individual de processar 1.1 quintilhões de instruções por segundo resultaria em uma capacidade combinada de testar aproximadamente 8 bilhões de bilhões de bilhões de possibilidades por ano (8 octilhões). Você não leu errado e não existe palavras duplicadas, se trata do número 8 seguido de 27 zeros.
Assim sendo, demoraríamos aproximadamente 458 mil bilhões de bilhões de bilhões de anos para varrer todas as possibilidades de combinação dos 256 bits de 0s e 1s. Considerando que o universo tem idade estimada em 13.8 bilhões de anos, demoraríamos muito mais tempo do que gostaríamos, não é mesmo?