Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.75 KB | None | 0 0
  1. <html>
  2. <head>
  3. <title> Algoritmo RSA </title>
  4. <script type="text/javascript">
  5.  
  6. if(!Array.prototype.indexOf) {
  7. Array.prototype.indexOf = function(v) {
  8. for(var i = 0; i < this.length; i++)
  9. if(this[i] == v)
  10. return i;
  11.  
  12. return -1;
  13. };
  14. }
  15.  
  16. Function.prototype.bind = function() {
  17. var __method = this, args = $A(arguments), object = args.shift();
  18. return function() {
  19. return __method.apply(object, args.concat($A(arguments)));
  20. };
  21. };
  22.  
  23. var $A = Array.from = function(iterable) {
  24. if (!iterable) return [];
  25.  
  26. if (iterable.toArray) {
  27. return iterable.toArray();
  28. } else {
  29. var results = [];
  30.  
  31. for (var i = 0; i < iterable.length; i++)
  32. results.push(iterable[i]);
  33.  
  34. return results;
  35. }
  36. };
  37.  
  38. var TimedLoop = function() {
  39. this.starter = function() {};
  40. this.condition = function() {};
  41. this.action = function() {};
  42. this.finisher = function() {};
  43.  
  44. this.timer = null;
  45. this.sleep = 0;
  46. };
  47.  
  48. TimedLoop.prototype = {
  49. start: function() {
  50. this.starter();
  51. this.execute.call(this);
  52. },
  53.  
  54. execute: function() {
  55. if(this.condition()) {
  56. this.action();
  57.  
  58. setTimeout(this.execute.bind(this), this.sleep);
  59. } else {
  60. this.finisher();
  61. }
  62. }
  63. };
  64.  
  65. var RSA = {
  66. generateKeys: function(p, q) {
  67. if(p == q) {
  68. alert('Os números devem ser diferentes');
  69. return;
  70. }
  71.  
  72. if(!RSA.isPrim(p) || !RSA.isPrim(q)) {
  73. alert('Os dois números devem ser primos');
  74. return;
  75. }
  76.  
  77. var N = p * q;
  78.  
  79. if(N <= 255) {
  80. alert('A multiplicação dos numeros deve ser superior a 255 para uma criptografia de caracteres ASCII');
  81. return;
  82. }
  83.  
  84. var e = RSA.nextPrim(RSA.fatorar((p - 1) * (q - 1)));
  85. var d = RSA.modInverse(e, (p - 1) * (q - 1));
  86.  
  87. return {number: N, public: e, private: d};
  88. },
  89.  
  90. encode: function(value, number, publicKey) {
  91. var mv = RSA.stringToASCII(value);
  92.  
  93. return RSA.process(mv, number, publicKey);
  94. },
  95.  
  96. decode: function(value, number, privateKey) {
  97. l = ('' + number).length;
  98. var mv = RSA.stringSplit(value, l);
  99.  
  100. return RSA.ASCIIToString(RSA.stringSplit(RSA.process(mv, number, privateKey), l));
  101. },
  102.  
  103. process: function(pieces, number, key) {
  104. l = ('' + number).length;
  105.  
  106. for(var i = 0; i < pieces.length; i++)
  107. pieces[i] = RSA.zeroFill(RSA.powMod(parseInt(pieces[i], 10), key, number), l);
  108.  
  109. return pieces.join('');
  110. },
  111.  
  112. minimunDivisor: function(n) {
  113. for(var i = 2; i < n; i++)
  114. if((n % i) == 0)
  115. return i;
  116.  
  117. return n;
  118. },
  119.  
  120. isPrim: function(n) {
  121. if(n <= 2)
  122. return false;
  123.  
  124. var md = RSA.minimunDivisor(n);
  125.  
  126. return md == n;
  127. },
  128.  
  129. nextPrim: function(arr) {
  130. var next = 0;
  131.  
  132. for(var i = 3; next == 0; i++)
  133. if(RSA.isPrim(i) && arr.indexOf(i) == -1)
  134. next = i;
  135.  
  136. return next;
  137. },
  138.  
  139. fatorar: function(n) {
  140. if(n < 2)
  141. return [];
  142.  
  143. var fatorado = [];
  144.  
  145. while(n != 1) {
  146. var md = RSA.minimunDivisor(n);
  147. fatorado.push(md);
  148. n /= md;
  149. }
  150.  
  151. return fatorado;
  152. },
  153.  
  154. modInverse: function(n, m) {
  155. for(var i = 1; true; i++)
  156. if(((n * i) % m) == 1)
  157. return i;
  158. },
  159.  
  160. ASCIIToString: function(pieces) {
  161. var string = '';
  162.  
  163. for(var i = 0; i < pieces.length; i++)
  164. string += String.fromCharCode(parseInt(pieces[i], 10));
  165.  
  166. return string;
  167. },
  168.  
  169. stringToASCII: function(string) {
  170. var ascii = [];
  171.  
  172. for(var i = 0; i < string.length; i++)
  173. ascii.push(string.charCodeAt(i));
  174.  
  175. return ascii;
  176. },
  177.  
  178. stringSplit: function(string, n) {
  179. var splited = [];
  180.  
  181. for(var i = 0; i < string.length; i += n)
  182. splited.push(string.substring(i, i + n));
  183.  
  184. return splited;
  185. },
  186.  
  187. powMod: function(n, e, m) {
  188. var f = n % m;
  189.  
  190. for(var i = 1; i < e; i++)
  191. f = (f * n) % m;
  192.  
  193. return f;
  194. },
  195.  
  196. zeroFill: function(n, n2) {
  197. n = n + '';
  198.  
  199. while(n.length < n2)
  200. n = '0' + n;
  201.  
  202. return n;
  203. }
  204. };
  205.  
  206. RSA.timedEncode = function(value, number, publicKey) {
  207. var mv = RSA.stringToASCII(value);
  208.  
  209. var f = function() {
  210. $('encriptedTextArea').value = this.mv.join('');
  211. };
  212.  
  213. RSA.timedProcess(mv, number, publicKey, f);
  214. };
  215.  
  216. RSA.timedDecode = function(value, number, privateKey) {
  217. l = ('' + number).length;
  218. var mv = RSA.stringSplit(value, l);
  219.  
  220. var f = function() {
  221. $('plainTextArea').value = RSA.ASCIIToString(RSA.stringSplit(this.mv.join(''), this.l));
  222. };
  223.  
  224. RSA.timedProcess(mv, number, privateKey, f);
  225. };
  226.  
  227. RSA.timedProcess = function(mv, number, key, f) {
  228. l = ('' + number).length;
  229.  
  230. var timer = new TimedLoop();
  231. timer.mv = mv;
  232. timer.number = number;
  233. timer.key = key;
  234. timer.i = 0;
  235. timer.l = ('' + number).length;
  236.  
  237. timer.condition = function() {
  238. return this.i < this.mv.length;
  239. };
  240.  
  241. timer.action = function() {
  242. this.mv[this.i] = RSA.zeroFill(RSA.powMod(parseInt(this.mv[this.i], 10), this.key, this.number), this.l);
  243.  
  244. $('progressBar').style.width = Math.round(this.i / (this.mv.length - 1) * 720) + 'px';
  245. $('valueCounter').innerHTML = 'Total: ' + this.mv.length + ' blocos<br>Completos: ' + (this.i + 1);
  246.  
  247. this.i++;
  248. };
  249.  
  250. timer.finisher = f;
  251.  
  252. timer.start();
  253. };
  254.  
  255. var $ = function(e) {
  256. return document.getElementById(e);
  257. };
  258.  
  259. var generateKeys = function() {
  260. var p1 = $('primo1').value;
  261. var p2 = $('primo2').value;
  262.  
  263. if(p1 == p2 || !RSA.isPrim(p1) || !RSA.isPrim(p2)) {
  264. alert('os numeros devem ser primos e distintos');
  265. return;
  266. }
  267.  
  268. var keys = RSA.generateKeys(p1, p2);
  269.  
  270. $('numeroField').value = keys.number;
  271. $('keyPublicField').value = keys.public;
  272. $('keyPrivateField').value = keys.private;
  273. };
  274.  
  275. var encriptText = function() {
  276. var n = $('numeroField').value;
  277. var e = $('keyPublicField').value;
  278. var t = $('plainTextArea').value;
  279.  
  280. RSA.timedEncode(t, n, e);
  281. };
  282.  
  283. var decriptText = function() {
  284. var n = $('numeroField').value;
  285. var d = $('keyPrivateField').value;
  286. var t = $('encriptedTextArea').value;
  287.  
  288. RSA.timedDecode(t, n, d);
  289. };
  290.  
  291. </script>
  292. <style>
  293.  
  294. .primos input {
  295. width: 60px;
  296. }
  297.  
  298. .tPrimos {
  299. border: 1px solid #000;
  300. height: 40px;
  301. width: 300px;
  302. overflow: auto;
  303. margin-bottom: 10px;
  304. white-space: nowrap;
  305. }
  306.  
  307. .transcode textarea {
  308. width: 300px;
  309. height: 300px;
  310. }
  311.  
  312. .transcode button {
  313. width: 110px;
  314. }
  315.  
  316. </style>
  317. </head>
  318. <body>
  319. <div class="tPrimos">
  320. <script type="text/javascript">
  321.  
  322. var primos = [];
  323.  
  324. for(var i = 3; i < 1000; i++)
  325. if(RSA.isPrim(i))
  326. primos.push(i);
  327.  
  328. document.write(primos.join(' | '));
  329.  
  330. </script>
  331. </div>
  332. <div class="primos">
  333. <input type="text" id="primo1" /> <input type="text" id="primo2" /> <button type="button" onclick="generateKeys();">Gerar Chaves</button>
  334. </div>
  335. <table>
  336. <tr>
  337. <td>Numero:</td>
  338. <td><input type="text" id="numeroField" /></td>
  339. </tr>
  340. <tr>
  341. <td>Chave Publica:</td>
  342. <td><input type="text" id="keyPublicField" /></td>
  343. </tr>
  344. <tr>
  345. <td>Chave Privada:</td>
  346. <td><input type="text" id="keyPrivateField" /></td>
  347. </tr>
  348. </table>
  349. <br />
  350. <table class="transcode">
  351. <tr>
  352. <td>Texto limpo:</td>
  353. <td></td>
  354. <td>Texto criptografado:</td>
  355. </tr>
  356. <tr>
  357. <td>
  358. <textarea id="plainTextArea"></textarea>
  359. </td>
  360. <td>
  361. <button type="button" onclick="encriptText();">Encriptar &raquo;</button><br />
  362. <button type="button" onclick="decriptText();">&laquo; Desencriptar</button><br />
  363. </td>
  364. <td>
  365. <textarea id="encriptedTextArea"></textarea>
  366. </td>
  367. </tr>
  368. </table>
  369. <div style="border: 1px solid #000; width: 720px; padding: 1px;">
  370. <div style="background: #77F; width: 0px; height: 16px;" id="progressBar"></div>
  371. </div>
  372. <div id="valueCounter"></div>
  373. </body>
  374. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement