Máquina Enigma e encriptação em XOR

Que tal passar no Orkut e mandar um scrap que só você e a pessoa que recebe irão entender? Você com certeza já ouviu falar de encriptação, mas sabe como funciona? A encriptação é uma arte dominada por poucos, mas usada por muitos. Você a usa no seu celular, no seu e-mail, no seu banco de dados, nas transações bancárias, etc.

[ Hits: 34.809 ]

Por: M4iir1c10 em 14/04/2007 | Blog: https://github.com/mauricioph


O código



Bom chega de papo, essa primeira parte era para quem gosta de história como eu :-)

Agora vamos ao código, usando a famosa dupla HTML/JAVASCRIPT vou passar os comandos para você criar a sua máquina enigma, que servirá para encriptar suas mensagens e desencriptar as mensagens enviadas para você.

Copie esse código e salve com a extensão .htm, mande esse arquivo para a pessoa que irá trocar mensagens com você, mande também a senha que será usada entre vocês, lembre-se que essa senha é "sensitive case", ou seja, existe diferença entre maiúscula e minúscula, portanto Mauricio, mauricio e MAURICIO são 3 senhas diferentes.

<HTML>
<HEAD>
<TITLE>ENIGMA XOR MACHINE</TITLE>
<SCRIPT LANGUAGE="JavaScript">
function encrypt(str, pwd) {
  if(pwd == null || pwd.length <= 0) {
    alert("Por favor entre com a senha para encriptar a mensagem.");
    return null;
  }
  var prand = "";
  for(var i=0; i<pwd.length; i++) {
    prand += pwd.charCodeAt(i).toString();
  }
  var sPos = Math.floor(prand.length / 5);
  var mult = parseInt(prand.charAt(sPos) + prand.charAt(sPos*2) + prand.charAt(sPos*3) + prand.charAt(sPos*4) + prand.charAt(sPos*5));
  var incr = Math.ceil(pwd.length / 2);
  var modu = Math.pow(2, 31) - 1;
  if(mult < 2) {
    alert("Algoritmo não pode encontrar um hash compatível. Por favor escolha outra senha. \nConsideracoes possíveis escolha uma senha mais difícil ou maior.");
    return null;
  }
  var salt = Math.round(Math.random() * 1000000000) % 100000000;
  prand += salt;
  while(prand.length > 10) {
    prand = (parseInt(prand.substring(0, 10)) + parseInt(prand.substring(10, prand.length))).toString();
  }
  prand = (mult * prand + incr) % modu;
  var enc_chr = "";
  var enc_str = "";
  for(var i=0; i<str.length; i++) {
    enc_chr = parseInt(str.charCodeAt(i) ^ Math.floor((prand / modu) * 255));
    if(enc_chr < 16) {
      enc_str += "0" + enc_chr.toString(16);
    } else enc_str += enc_chr.toString(16);
    prand = (mult * prand + incr) % modu;
  }
  salt = salt.toString(16);
  while(salt.length < 8)salt = "0" + salt;
  enc_str += salt;
  return enc_str;
}

function decrypt(str, pwd) {
  if(str == null || str.length < 8) {
    alert("Não foi possível desencriptar pois a mensagem e muito pequena os cálculos retornam um numero negativo.");
    return;
  }
  if(pwd == null || pwd.length <= 0) {
    alert("Por favor coloque a senha para desencriptar a mensagem.");
    return;
  }
  var prand = "";
  for(var i=0; i<pwd.length; i++) {
    prand += pwd.charCodeAt(i).toString();
  }
  var sPos = Math.floor(prand.length / 5);
  var mult = parseInt(prand.charAt(sPos) + prand.charAt(sPos*2) + prand.charAt(sPos*3) + prand.charAt(sPos*4) + prand.charAt(sPos*5));
  var incr = Math.round(pwd.length / 2);
  var modu = Math.pow(2, 31) - 1;
  var salt = parseInt(str.substring(str.length - 8, str.length), 16);
  str = str.substring(0, str.length - 8);
  prand += salt;
  while(prand.length > 10) {
    prand = (parseInt(prand.substring(0, 10)) + parseInt(prand.substring(10, prand.length))).toString();
  }
  prand = (mult * prand + incr) % modu;
  var enc_chr = "";
  var enc_str = "";
  for(var i=0; i<str.length; i+=2) {
    enc_chr = parseInt(parseInt(str.substring(i, i+2), 16) ^ Math.floor((prand / modu) * 255));
    enc_str += String.fromCharCode(enc_chr);
    prand = (mult * prand + incr) % modu;
  }
  return enc_str;
}
//  End -->
</script>

</HEAD>


<BODY>

<form name="box"><center>
  <p>Toda mensagem para ser criptografada deve ser colocada no primeiro campo, digite a senha entre os botoes e clique encrypt, a mensagem será encriptada no segundo campo copie e cole na pagina desejada.</p>
  <p>Para desencriptar, coloque a mensagem recebida no segundo campo e digite a senha recebida, clique decrypt no campo 1 ira aparecer a mensagem enviada... Caso esteja ilegível repita o processo prestando atenção na senha. </p>

  <table cellpadding=0 cellspacing=0 border=0><tr><td colspan=3>
<textarea cols=40 rows=5 wrap=virtual name=ipt>COLOQUE SUA MENSAGEM AQUI</textarea>
</td></tr>
<tr height=50><td valign="top">
<input type="button" onClick="document.box.opt.value= encrypt(document.box.ipt.value, document.box.pwd.value);" value="Encrypt">
</td><td align="center" valign="center">
<input type="password" name="pwd" value="">
</td><td align="right" valign="bottom">
<input type="button" onClick="document.box.ipt.value= decrypt(document.box.opt.value, document.box.pwd.value);" value="Decrypt">
</td></tr>
<tr><td colspan=3>
<textarea cols=40 rows=5 wrap=virtual name=opt></textarea>
</td></tr></table>
</center>

</form>

</BODY></HTML>

Conclusão

Agora é só escrever sua mensagem, colocar sua senha e mandar para a pessoa desejada.

Quero deixar bem claro que esse script deve ser usado com responsabilidade, o conteúdo das mensagens que você mandar serão sigilosos e seguros, dependendo das duas pessoas envolvidas guardarem a senha entre eles.

Caso alguém copie esse código e não tenha a senha não quer dizer que a pessoa vai saber o que você escreveu, pois a senha errada vai retornar uma mensagem incompreensível. Não use esse script para uso ilegal como comunicação com alguém na cadeia para planejar uma fuga ou planejar seqüestro, etc. :)

Esse script tem propósito apenas educativo.

Página anterior    

Páginas do artigo
   1. A história
   2. O código
Outros artigos deste autor

Instalando e configurando um dock igual ao Mac Leopard no KDE

Proteção de tela ou vídeo como papel de parede

Servidor de Mídia com 128 MB de RAM

Áudio Profissional no GNU/Linux

Colocando Windows, Linux e Mac Os X em um mesmo PC

Leitura recomendada

Como traduzir Software Livre - Um método fácil

Proteja seu website ou página html com encriptaçâo

Instalação e configuração do LMS Moodle no Linux

Entenda o XML - Parte 2

Instalando o Java Plug-in no Mozilla

  
Comentários
[1] Comentário enviado por tenchi em 15/04/2007 - 18:50h

Kra, muito legal o script. Você que fez?

[2] Comentário enviado por Ruy_Go em 16/04/2007 - 00:14h

Velho Muito TOP Mesmo, como eh a chave de criptografia????
Qual o valor da chave?????

Parabéns

[3] Comentário enviado por M4iir1c10 em 16/04/2007 - 07:20h

E isso ai Tenchi, eu fiz e estou preparando um outro que faz a conversao de ascii para hexadecimal e unicode os caracteres em ascii sao esses que vc esta lendo agora os hexadecimais sao (0-1-2-3-4-5-6-7-8-9-A-B-C-D-E-F), ja o unicode e a codificacao de cada tecla do seu teclado em todos os idiomas do mundo (Latin, Chines, Japones, Israelense, Russo, Hindi, etc).

Bom Ruy o negocio e o seguinte, a encriptacao em xor e diferente da hexa porque a chave e uma variavel, oque esse script faz e comparar a primeira area de texto com a senha e produzir o codigo na segunda area de texto, portando a chave e o valor colocado na senha, dependendo do tamanho da senha essa chave pode ser multiplo de 32 (32x64x96x128...) um letra a mais ou a menos faz uma diferenca enorme no resultado final.

[4] Comentário enviado por Ed_slacker em 16/04/2007 - 09:39h

Muuuuiiiitttoooo booooommmm!!
Seu artigo está massa, velho!!
Continue assim!!

PS: Semana que vem eu irei estrear minha coleção de artigos aqui.

Amplexos.

[5] Comentário enviado por sryche em 16/04/2007 - 13:29h

Muitíssimo interessante mesmo :)

[6] Comentário enviado por mauricioht em 12/10/2007 - 16:20h

po, nem vi o código direito ( faltou paciencia e conhecimento de html ), mas, se encriptação em XOR for oq eu acho que é, digo que esta não é segura. Isso acontece porque a senha é repetida diversas vezes para seus caracteres serem combinados em XOR com cada caracter do texto. Essa repetição permite que a partir da combinação de trechos próprio resultado encriptado, você encontre a chave. Aí a única coisa que vc precisa "advinhar" é o comprimento da senha, pra saber a freqüencia de repetição dela, basta sair testando, já que o processo é rápido. A não ser que a chave seja maior que o texto.

Tinha visto um programa que quebrava a criptografia, mas isso foi na época do Visual Basic + Windows....

Mais um motivo pra não usar em coisas ilegais.

Abraço

[7] Comentário enviado por M4iir1c10 em 12/10/2007 - 22:32h

Nao vou dizer que essa encriptacao e a mais segura do momento porque nao e, mais eu posso dizer que e uma das mais seguras, para vc ter uma ideia os caras para descobrir o sgnificado de uma carta do hitler encriptada em xor tiveram que estudar os possiveis cauculos de 1926 ate 1933 quando finalmente eles conseguiram... oque torna essa encriptacao dificil de ser decifrada e que o resultado dos caracteres nunca sao iguais, como voce esta imaginando...

Ao que eu entendi da sua explicacao, voce le a mensagem e procura a letra A digamos que a letra A se ja encriptada como Bg entao onde vc encontrar Bg no texto vc assume que seja a letra A, porem nao e isso que acontece.

se vc colocar a letra A na parte da mensagem 4 vezes e colocar a senha A.

O primeiro A=fa18
O segundo A=7aa5
O terceiro A=04b3
O quarto A=cda8

AAAA=fa187aa504b3cda8

ou seja a letra nunca vai ser repetida na mensagem encriptada mesmo que repita na mensagem normal.

Agora se a senha for AA

A=9b53
A=f6dc
A=039b
A=4114

entao senha A
palavra AAAA=fa187aa504b3cda8

senha AA
palavra AAAA=9b53f6dc039b4114

Detalhe mesmo acrescentando um A a mais na senha o tamanho da palavra ainda e proporcional a palavra original, ou seja A = uma letra
fa18 = 4 letras, A = uma letra 9b53 = 4 letras.

embora oque fez a diferenca de fa18 para 9b53 foi um A a mais na senha.

entao ate eu achar uma combinacao que encaixe com a original serao bilhoes de tentativas ate encontrar a correta, nao e atoa que para decifrar uma carta eles levaram 7 anos.

[8] Comentário enviado por claonilton em 17/04/2008 - 19:17h

Muito bom... este sistema de encriptação conheço um tb muito antigo conhecido como "quadrado perfeito" e acredito que foi o primeiro método de encriptação.

[9] Comentário enviado por diegofsouza em 04/11/2008 - 13:52h

cara.. muito bom mesmo... existe alguma forma de quebrar o código sem a senha?
abraço!

[10] Comentário enviado por M4iir1c10 em 05/11/2008 - 03:49h

Existir existe como qualquer outra encriptacao, porem pela complexidade e a variacao fica dificil de quebrar como mencionei no comentario a cima levaram 7 anos para decifrarem uma carta de Hitler com essa encriptacao.

[11] Comentário enviado por gabriel_h em 22/06/2012 - 20:00h

Não posso afirmar que a encriptação é fraca ou forte, mas o tempo que demoraram pra decifrar a carta em 1926 é praticamente irrelevante, considerando os avanços na capacidade de processamento desde aquela epoca, um smartphone de hoje supera de longe todas as formas de computação que existiam no mundo na época somadas, logo se na epoca quebraram em 7 anos por um processo algoritmizavel, hj em dia seria quebravel em minutos, o problema é se esse processo é algoritmizavel ou não


Contribuir com comentário