quarta-feira, 2 de abril de 2014

Cifra XOR

A cifra XOR, é uma das cifras de fluxo mais simples que existem , normalmente é usada como cifra adicional por outros algoritmos , que realizam mais operações matematicas =D.

A encriptação funciona da seguinte maneira:

Primeiro , transformamos os caracteres em codigo ascii:

a -> 65 => ascii
b -> 66 => ascii

Feito isso , transformamos o codigo ascii , decimal , em binario , da seguinte maneira:
65/2 = 32 | 32/2 = 16 | 16/2 = 8 | 8/2 = 4 | 4/2 = 2 | 2/2 = 1 <-- Começamos por esse numero
65%2 = 1  | 32%2 = 0  | 16%2 = 0 | 8%2 = 0 | 4%2 = 0 | 2%2 = 0
       ^
       |
        ----- terminamos por esse numero

66/2 = 33 | 33/2 = 16 | 16/2 = 8 | 8/2 = 4 | 4/2 = 2 | 2/2 = 1
66%2 = 0  | 33%2 = 1  | 16%2 = 0 | 8%2 = 0 | 4%2 = 0 | 2%2 = 0

a -> 1000001
b -> 1000010
     -------
? -> 0000011 = XOR
          ^^
          |___ " como podem ver , os numeros de cima , não correspondem aos de baixo , e por esse motivo , eles estão incluidos aqui "
Obtido o resultado , transforma-se binario para decimal denovo , um metodo simples é usando essa tabela:
 ... | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
     |     |     |  0 |  0 |  0 | 0 | 0 | 1 | 1 |
3 é o resultado (1+2) , que sera convertido em caractere. Não precisamos sempre transformar o codigo ascii de um caractere em binario , para obter o resultado de uma operação do tipo XOR , é so usarmos o operador '^' , exemplo:
$ echo $((65^66))
3
Implementação em perl:
#!/usr/bin/perl -w

use strict;
use Getopt::Std;


sub help {
print <<B
 [+] XOR CRYPT || MMxM
 [+] hc0der.blogspot.com

 [*] -f input file
 [*] -o output file
 [*] -k key
B
;
exit(1);
}

my %opts;
getopts('f:o:k:', \%opts);

help if(!$opts{'k'} || !$opts{'f'} || !$opts{'o'});

my @key = split(//,$opts{'k'});
my $size_key = $#key;
my $kp = 0;

open(F,'<'.$opts{'f'}) || die($!);
open(O,'>'.$opts{'o'}) || die($!);

while(<F>){
 my @word = split(//,$_);

 for(my $i=0;$i<=($#word);$i++){
  print O chr(ord($word[$i])^ord($key[$kp]));
  ($kp == $size_key) ? $kp = 0 : $kp++;
 }
}

In action:
$ perl xor.pl
 [+] XOR CRYPT || MMxM
 [+] hc0der.blogspot.com

 [*] -f input file
 [*] -o output file
 [*] -k key
$ perl xor.pl -f /etc/passwd -o /tmp/crypt -k mmxm
$ perl xor.pl -f /tmp/crypt -o /tmp/decrypt -k mmxm
$ md5sum /etc/passwd /tmp/decrypt
d506aadfbaf2e21f9791552bb150eb13  /etc/passwd
d506aadfbaf2e21f9791552bb150eb13  /tmp/decrypt

Nenhum comentário:

Postar um comentário