From a4dfb37a7d8f27e8f3e81832292fcc537bd826df Mon Sep 17 00:00:00 2001 From: Mylloon Date: Wed, 26 Oct 2022 15:37:35 +0200 Subject: [PATCH] fix rsa implementation --- src/public/js/main.js | 23 +++++++----- src/public/js/rsa.js | 81 +++++++++++++++++++++++++--------------- src/templates/index.html | 6 --- 3 files changed, 64 insertions(+), 46 deletions(-) diff --git a/src/public/js/main.js b/src/public/js/main.js index cf8a18c..e95175a 100644 --- a/src/public/js/main.js +++ b/src/public/js/main.js @@ -1,4 +1,4 @@ -import { gen_RSA_keypair, RSA_enc } from "./rsa.js"; +import { gen_RSA_keypair, RSA_dec, RSA_enc } from "./rsa.js"; window.addEventListener("load", () => main()); @@ -57,15 +57,18 @@ const send = (file, element) => { } // Encrypt the file - gen_RSA_keypair(1024).then((keys) => - console.log(`p=${keys[0]}, s=${keys[1]}`) - ); + file.text().then((content) => { + gen_RSA_keypair(1024).then((keys) => { + let x = RSA_enc(content, keys[1]); + console.log(RSA_dec(x, keys[0])); - // Send it - const data = new FormData(); - data.append("file", file); + // Send it + const data = new FormData(); + data.append("file", file); - const req = new XMLHttpRequest(); - req.open("POST", "upload"); - req.send(data); + const req = new XMLHttpRequest(); + req.open("POST", "upload"); + req.send(data); + }); + }); }; diff --git a/src/public/js/rsa.js b/src/public/js/rsa.js index ed52a10..e27dffa 100644 --- a/src/public/js/rsa.js +++ b/src/public/js/rsa.js @@ -1,13 +1,11 @@ -BigNumber.prototype.floor = function () { - return this.integerValue(BigNumber.ROUND_FLOOR); -}; +import { modInv, modPow } from "./libs/bigint-mod.js"; export const gen_RSA_keypair = async (bits) => { const getPrime = (bits) => { return new Promise((ok, ko) => { forge.prime.generateProbablePrime(bits, (err, data) => { if (err) return ko(err); - ok(new BigNumber(data)); + ok(BigInt(data)); }); }); }; @@ -18,36 +16,59 @@ export const gen_RSA_keypair = async (bits) => { const q = await getPrime(pq_size); console.assert(p != q); - const n = p.times(q); + const n = p * q; - const phi_n = p.minus(1).times(q.minus(1)); + const phi_n = (p - 1n) * (q - 1n); - const e = new BigNumber(65537); - console.assert(e.isLessThan(phi_n) && phi_n.modulo(e) != 0); + const e = 65537n; + console.assert(e < phi_n && phi_n % e != 0n); - // https://stackoverflow.com/a/51562038/15436737 - const inverse = (a, m) => { - const s = []; - let b = m; - while (b) { - [a, b] = [b, a % b]; - s.push({ a, b }); - } - let x = 1; - let y = 0; - for (let i = s.length - 2; i >= 0; --i) { - [x, y] = [y, x - y * Math.floor(s[i].a / s[i].b)]; - } + const d = modInv(e, phi_n); - return ((y % m) + m) % m; - }; - - const d = inverse(e, phi_n); - - console.log((e, n), (d, n)); - return [(e, n), (d, n)]; + return [ + [e, n], + [d, n], + ]; }; -const RSA = () => {}; +const RSA = (msg, key) => { + return modPow(msg, key[0], key[1]); +}; -export const RSA_enc = (key, data) => {}; +export const RSA_enc = (data, key) => { + return RSA(str_to_int(data)[0], key); +}; + +export const RSA_dec = (data, key) => { + return int_to_str([RSA(data, key)]); +}; + +const str_to_int = (msg) => { + let result = ""; + let table = []; + for (let i = 0; i < msg.length; i++) { + result += String(msg[i].charCodeAt(0)).padStart(3, "0"); + if (result.length == 100) { + table.push(BigInt(`1${result}`)); + } + } + table.push(BigInt(`1${result}`)); + + return table; +}; + +const int_to_str = (msg) => { + let result = ""; + for (let k = 0; k < msg.length; k++) { + let full_msg = msg[k].toString().slice(1); + for (let i = 0, step = 3; i < full_msg.length; i += step) { + let txt = ""; + for (let j = 0; j < step; j++) { + txt += full_msg.charAt(i + j); + } + result += String.fromCharCode(parseInt(txt)); + } + } + + return result; +}; diff --git a/src/templates/index.html b/src/templates/index.html index 9044343..81604c0 100644 --- a/src/templates/index.html +++ b/src/templates/index.html @@ -40,12 +40,6 @@ crossorigin="anonymous" referrerpolicy="no-referrer" > -