Mês: novembro 2013

Criptografia básica usando XOR e seus problemas

A operação XOR, Exclusive or, Ou Exclusivo é uma operação lógica obrigatória nos microcontroladores. Suas aplicações são muitas como a comparação de bytes (com resultado zero se iguais), adição sem transporte, zerar registradores sem carregar o zero de imediato e muito usado na criptografia.

Com a seguinte tabela da verdade:

  • 0 ^ 0 = 0
  • 0 ^ 1 = 1
  • 1 ^ 0 = 1
  • 1 ^ 1 = 0

a tabela diz que quando os bits são iguais o resultado será zero. Já olhando para uma cadeia de bytes, ou uma string, o XOR tem a caracteristica de  misturar duas cadeias de bytes de forma que se possa recuperar a cadeia original usando somente a outra. Como no exemplo feito no octave:

  • octave:44> char(bitxor(double("texto plano"),double("12345@12345")))
    ans = EWK@Z`A^RZZ
    octave:45> char(bitxor(double("EWK@Z`A^RZZ"),double("12345@12345")))
    ans = texto plano
    octave:46>
     

Um leitor desavisado ficará tentado a implementar alguma criptografia utilizando somente este artíficio, mas há problemas a serem evidenciados.

Tamanho da chave

O problema de criptografar uma cadeia qualquer utilizando este método é a necessidade de uma chave com o mesmo tamanho da cadeia. Assim se pensarmos em criptografar um DVD cheio teremos que mandar outro DVD com a chave pois ambos terão o mesmo tamanho. Pode ser útil. Mas não é muito prático quando se precisa transmitir ou armazenar a informação plana. Não é uma criptografia fraca. De fato se a chave for aleatória o suficiente (se aproximando do ruido) este método é considerado o melhor, pois a operação XOR tem a propriedade de agregar a aleatoriedade da chave à cadeia de informação que é bem organizada. Veja que uma cadeia bem organizada pode por meios estatisticos facilitar a descriptografia por um terceiro.

Geração da chave

Se por um acaso pretende usar este formato de criptografia veja que a chave deve ser aleatória o suficiente e não ter muitos blocos repetidos. Uma forma de se conseguir esta chave é se utilizar de fenômenos físicos que apesar de todas as leis da fisica estarem escritas; para nossos olhos e de um computador é um fenômeno imprevisível e verdadeiramente aleatório. São fenômenos muitos utilizados o efeito Zener de um diodo Zener polarizado inversamente, o ruido térmico em resistores ou mesmo fenômenos atmosféricos. A combinação destes métodos também é possível.

Há na internet e muito popular em revistas de eletrônica os geradores de ruido branco feitos para simular os pratos das baterias (com um efeito de attack e fade)  ou para acalmar os nervos (parecem chuva, rios, praias). Estes geradores feitos com amplificação do ruido de um transistor sem polarização são um exemplo de geradores de chaves.

Gerando tabelas C/C++ no octave

Uma forma rápida de se fazer tabelas de consultas C/C++ usando o octave é:


printf ("{") , printf("%d,",v) , printf("}");

Onde v é um vetor com os valores.

Por exemplo para 1024 valores de senos até PI em 16 bits use:

octave:> p = (pi) / 1024
p = 0.0030679615757713
octave:> v = uint16(1024*sin([0:p:(pi)])) 
// Veja que para valores negativos não dará certo
v =  0  3  6  9  13  16  19  

Valores em hexadecimal?

printf ("{") , printf("0x%x,",v) , printf("}");