Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Wilker

Criptografia RSA

Recommended Posts

continuando meus estudos na area de criptografia eu fiz um script q usa o algorito RSA dessa vez, esse é um algoritmo de chave publica, quem tiver + interesse tem mto assunto sobre isso na net, vo dexando meu codigo aki:

 

<html><head><title> Algoritmo RSA </title><script type="text/javascript">if(!Array.prototype.indexOf) {	Array.prototype.indexOf = function(v) {		for(var i = 0; i < this.length; i++)			if(this[i] == v)				return i;				return -1;	};}Function.prototype.bind = function() {	var __method = this, args = $A(arguments), object = args.shift();	return function() {		return __method.apply(object, args.concat($A(arguments)));	};};var $A = Array.from = function(iterable) {	if (!iterable) return [];		if (iterable.toArray) {		return iterable.toArray();	} else {		var results = [];				for (var i = 0; i < iterable.length; i++)			results.push(iterable[i]);				return results;	}};var TimedLoop = function() {	this.starter = function() {};	this.condition = function() {};	this.action = function() {};	this.finisher = function() {};		this.timer = null;	this.sleep = 0;};TimedLoop.prototype = {	start: function() {		this.starter();		this.execute.call(this);	},		execute: function() {		if(this.condition()) {			this.action();						setTimeout(this.execute.bind(this), this.sleep);		} else {			this.finisher();		}	}};var RSA = {	generateKeys: function(p, q) {		if(p == q) {			alert('Os números devem ser diferentes');			return;		}				if(!RSA.isPrim(p) || !RSA.isPrim(q)) {			alert('Os dois números devem ser primos');			return;		}				var N = p * q;				if(N <= 255) {			alert('A multiplicação dos numeros deve ser superior a 255 para uma criptografia de caracteres ASCII');			return;		}				var e = RSA.nextPrim(RSA.fatorar((p - 1) * (q - 1)));		var d = RSA.modInverse(e, (p - 1) * (q - 1));				return {number: N, public: e, private: d};	},		encode: function(value, number, publicKey) {		var mv = RSA.stringToASCII(value);				return RSA.process(mv, number, publicKey);	},		decode: function(value, number, privateKey) {		l = ('' + number).length;		var mv = RSA.stringSplit(value, l);				return RSA.ASCIIToString(RSA.stringSplit(RSA.process(mv, number, privateKey), l));	},		process: function(pieces, number, key) {		l = ('' + number).length;				for(var i = 0; i < pieces.length; i++)			pieces[i] = RSA.zeroFill(RSA.powMod(parseInt(pieces[i], 10), key, number), l);				return pieces.join('');	},		minimunDivisor: function(n) {		for(var i = 2; i < n; i++)			if((n % i) == 0)				return i;				return n;	},		isPrim: function(n) {		if(n <= 2)			return false;				var md = RSA.minimunDivisor(n);				return md == n;	},		nextPrim: function(arr) {		var next = 0;				for(var i = 3; next == 0; i++)			if(RSA.isPrim(i) && arr.indexOf(i) == -1)				next = i;				return next;	},		fatorar: function(n) {		if(n < 2)			return [];				var fatorado = [];				while(n != 1) {			var md = RSA.minimunDivisor(n);			fatorado.push(md);			n /= md;		}				return fatorado;	},		modInverse: function(n, m) {		for(var i = 1; true; i++)			if(((n * i) % m) == 1)				return i;	},		ASCIIToString: function(pieces) {		var string = '';				for(var i = 0; i < pieces.length; i++)			string += String.fromCharCode(parseInt(pieces[i], 10));				return string;	},		stringToASCII: function(string) {		var ascii = [];				for(var i = 0; i < string.length; i++)			ascii.push(string.charCodeAt(i));				return ascii;	},		stringSplit: function(string, n) {		var splited = [];				for(var i = 0; i < string.length; i += n)			splited.push(string.substring(i, i + n));				return splited;	},		powMod: function(n, e, m) {		var f = n % m;				for(var i = 1; i < e; i++)			f = (f * n) % m;				return f;	},		zeroFill: function(n, n2) {		n = n + '';				while(n.length < n2)			n = '0' + n;				return n;	}};RSA.timedEncode = function(value, number, publicKey) {	var mv = RSA.stringToASCII(value);		var f = function() {		$('encriptedTextArea').value = this.mv.join('');	};		RSA.timedProcess(mv, number, publicKey, f);};	RSA.timedDecode = function(value, number, privateKey) {	l = ('' + number).length;	var mv = RSA.stringSplit(value, l);		var f = function() {		$('plainTextArea').value = RSA.ASCIIToString(RSA.stringSplit(this.mv.join(''), this.l));	};		RSA.timedProcess(mv, number, privateKey, f);};	RSA.timedProcess = function(mv, number, key, f) {	l = ('' + number).length;		var timer = new TimedLoop();	timer.mv = mv;	timer.number = number;	timer.key = key;	timer.i = 0;	timer.l = ('' + number).length;		timer.condition = function() {		return this.i < this.mv.length;	};		timer.action = function() {		this.mv[this.i] = RSA.zeroFill(RSA.powMod(parseInt(this.mv[this.i], 10), this.key, this.number), this.l);				$('progressBar').style.width = Math.round(this.i / (this.mv.length - 1) * 720) + 'px';		$('valueCounter').innerHTML = 'Total: ' + this.mv.length + ' blocos<br>Completos: ' + (this.i + 1);				this.i++;	};		timer.finisher = f;		timer.start();};var $ = function(e) {	return document.getElementById(e);};var generateKeys = function() {	var p1 = $('primo1').value;	var p2 = $('primo2').value;		if(p1 == p2 || !RSA.isPrim(p1) || !RSA.isPrim(p2)) {		alert('os numeros devem ser primos e distintos');		return;	}		var keys = RSA.generateKeys(p1, p2);		$('numeroField').value = keys.number;	$('keyPublicField').value = keys.public;	$('keyPrivateField').value = keys.private;};var encriptText = function() {	var n = $('numeroField').value;	var e = $('keyPublicField').value;	var t = $('plainTextArea').value;		RSA.timedEncode(t, n, e);};var decriptText = function() {	var n = $('numeroField').value;	var d = $('keyPrivateField').value;	var t = $('encriptedTextArea').value;		RSA.timedDecode(t, n, d);};</script><style>.primos input {	width: 60px;}.tPrimos {	border: 1px solid #000;	height: 40px;	width: 300px;	overflow: auto;	margin-bottom: 10px;	white-space: nowrap;}.transcode textarea {	width: 300px;	height: 300px;}.transcode button {	width: 110px;}</style></head><body><div class="tPrimos"><script type="text/javascript">var primos = [];for(var i = 3; i < 1000; i++)	if(RSA.isPrim(i))		primos.push(i);document.write(primos.join(' | '));</script></div><div class="primos"><input type="text" id="primo1" /> <input type="text" id="primo2" /> <button type="button" onclick="generateKeys();">Gerar Chaves</button></div><table>	<tr>		<td>Numero:</td>		<td><input type="text" id="numeroField" /></td>	</tr>	<tr>		<td>Chave Publica:</td>		<td><input type="text" id="keyPublicField" /></td>	</tr>	<tr>		<td>Chave Privada:</td>		<td><input type="text" id="keyPrivateField" /></td>	</tr></table><br /><table class="transcode">	<tr>		<td>Texto limpo:</td>		<td></td>		<td>Texto criptografado:</td>	</tr>	<tr>		<td>			<textarea id="plainTextArea"></textarea>		</td>		<td>			<button type="button" onClick="encriptText();">Encriptar »</button><br />			<button type="button" onClick="decriptText();">« Desencriptar</button><br />		</td>		<td>			<textarea id="encriptedTextArea"></textarea>		</td>	</tr></table><div style="border: 1px solid #000; width: 720px; padding: 1px;">	<div style="background: #77F; width: 0px; height: 16px;" id="progressBar"></div></div><div id="valueCounter"></div></body></html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Amigo!

 

Por acaso encontrei seu Algoritmo e creio que existe algo a ser testado nele. por exemplo, se você digitar a letra "u" e criptografa-lo e mais tarde criptografar "uu" vai notar que os numeros se repetem. você não pode criptografar letra por letra. Deve criptografar blocos inteiros. Se utilizar este codigo, não vai estar criptografando. Só substituindo letras por números.

 

Exemplo:

p e q = 991 e 997

u = 772112

e uuuu = 772112772112772112772112

 

você deve transformar blocos como o "uu" em um único inteiro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

oi cara, valeu pela dica :)

 

mas na epoca desse algoritmo eu apenas queria fazer os testes mesmo relativos a criptografia de chave dupla

 

seria legal você alterar o script para ficar algo de uso mais real, mas esse ai postado é apenas para fins de teste mesmo ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.