Criptografia RSA
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>Discussão (2)
Carregando comentários...