Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <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>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement