
Neste artigo vamos aborda a porta lógica XOR ou OU Exclusivo, para fins de realizar uma criptografia.
Antes de qualquer coisa vamos a algumas informações teóricas.
1 – Representação dos dados.
Oas dados podem ser representados em diferentes bases, um ‘A’ precisa ser uma representação numérica da Base 2 ou binária para que os computadores possam entendê-los. Abaixo uma tabela com direrentes tipos de representação de um mesmo dado:
Codificação/Base | Representação de “Oi” | Descrição |
---|---|---|
ASCII | O (79), i (105) | Valores decimais ASCII de cada caractere |
Binário (8 bits por caractere) | 01001111 01101001 | Representação binária dos valores ASCII |
Decimal | 79 105 | Valores decimais diretos dos caracteres ASCII |
Hexadecimal | 4F 69 | Valores hexadecimais dos caracteres ASCII |
Base64 | T2k= | Representação em Base64 da string “Oi” |
Octal | 117 151 | Valores octais dos caracteres ASCII |
UTF-8 | O (U+004F), i (U+0069) | Ponto de código Unicode |
URL Encoding | %4F%69 | Codificação percentual para URLs |
Agora que sabemos dessas formas de representação de dados, vamos entender o XOR.
2 – XOR e tabela verdade.
Um XOR (OU Exclusivo) é uma porta lógica usada em circuitos digitais, também conhecida como detector de desigualdade da eletrônica digital.
Ele é formado por um conjunto de outros portas lógicas (AND, OR e NOT) e as aplicações mais comuns são:
– Somadores binários (Circuitos aritiméticos).
– Detecção de diferenças.
– Controle de paridade (Verificação de erros).
– Criptogarfia (Operações bit a bit).
Sua tabela verdade é a seguite:
Tabela verdade com duas entradas, A e B.
Sua saida sempre será 1 quando os valores das entradas forem diferentes e 0 quando forem iguais.
A | B | Saída |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Uma propriedade interessante do XOR é que ele é reversível.
Com a saída da tabela anterior conseguimos obter o valor de A apenas aplicando o XOR da saída com o a entrada B.
Saída da tabela anterior | B | A |
---|---|---|
0 | 0 | 0 |
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
E o que isso tem a ver com criptografia?
3 – A criptografia!
O XOR é uma maneira rápida e barata de criptografar dados, vamos ver abaixo como fazer isso utilizando python.
import base64
data = 'difusaotech'
key = 'L'
encrypted = ''.join([chr(ord(x) ^ ord(key)) for x in data])
print('Criptografado')
#Saida direta do XOR
print(f"XOR: {encrypted}")
#Saida em base64
encrypted_b64 = base64.b64encode(encrypted.encode()).decode()
print(f"XOR + Base64: {encrypted_b64}\n")
#Descriptografado
print('Descriptografado')
decrypted = ''.join([chr(ord(x) ^ ord(key)) for x in encrypted])
print(decrypted)
Explicação:
A linha que faz a criptografia usa o operador XOR “^” do python para criptografar, porém temos algumas passos a serem realizados antes.
encrypted = ”.join([chr(ord(x) ^ ord(key)) for x in data])
A nossa palavra a ser criptografada deve estar em base numérica para que o operador XOR consiga realizar a operação, e a conversão da letra em base numérica é feita pela linha abaixo:
ord(x) : Onde x representa cada caracter sendo passado pelo for.
ord(key) : Onde key é a palavra passe (Nossa senha) para a criptografia, no caso a letra “L”.
Assim ord() converte cada letra no seu representante da tabela ASCII, no caso da palavra chave o valor 76 e as letras em “x” para cada representante correspondente.
Isso tudo sendo calculado bit a bit pelo XOR “^”.
encrypted = ”.join([chr(ord(x) ^ ord(key)) for x in data])
Em seguida o chr() pega o resultado de cada saida em sua forma numérica e converte para caracter.
encrypted = ”.join([chr(ord(x) ^ ord(key)) for x in data])
O join junta todos os caracteres da saida do chr() para que possa formar a nossa palavra encriptada.
encrypted = ”.join([chr(ord(x) ^ ord(key)) for x in data])
Foi utilizado também o base64 pois alguns caracteres podem não ser exibidos no console.
encrypted_b64 = base64.b64encode(encrypted.encode()).decode()
4 – Descriptografia.
A parte da descriptografia será feita da mesma forma sendo que de forma contraria, sendo que agora usamos a saida, a nossa palavra encriptada junto ao XOR e nossa senha.
decrypted = ”.join([chr(ord(x) ^ ord(key)) for x in encrypted])
Vou deixar abaixo o correspondente do código agora em PHP:
for ($i = 0; $i < strlen($data); $i++) {
// Aplica XOR entre o caractere atual e o caractere correspondente da chave
$encrypted .= chr(ord($data[$i]) ^ ord($key[$i % $keyLength]));
}
Sabemos que isso é apenas o básico, o código pode ser melhorado para permitir chaves maiores entre outras melhorias.
Até a próxima.
Para mais artigos sobre criptografia: https://difusao.tech/blog/criptografia/
Qualquer sugestão, vamos manter contato, siga: https://www.instagram.com/leonardofcosta/