Riskless/static/js/modules/crypto/rsa.js

48 lines
1.0 KiB
JavaScript
Raw Normal View History

2023-03-04 00:25:54 +00:00
import { generate_prime } from "./random_primes.js";
import { mod_exp, mod_inv } from "./math.js";
let p, q, pubKey, privKey;
class PubKey {
constructor(p, q) {
this.n = p * q;
this.e = 65537;
}
decrypt(m) {
return mod_exp(m, this.e, this.n);
}
}
class PrivKey {
constructor(p, q) {
this.n = p * q;
this.d = mod_inv(65537, (q - 1) * (p - 1));
}
encrypt(c) {
return mod_exp(c, this.d, this.n);
}
}
export function generate_rsa_keypair() {
if (window.sessionStorage.getItem("rsa_p") === null) {
p = generate_prime();
window.sessionStorage.setItem("rsa_p", p);
} else {
p = BigInt(window.sessionStorage.getItem("rsa_p"));
}
if (window.sessionStorage.getItem("rsa_q") === null) {
q = generate_prime();
window.sessionStorage.setItem("rsa_q", q);
} else {
q = BigInt(window.sessionStorage.getItem("rsa_q"));
}
pubKey = new PubKey(p, q);
privKey = new PrivKey(p, q);
return { pubKey, privKey };
}