RSA(RSA)
利用大素数相乘求出的非对称加密算法
- 随机找出两个大素数,,相乘为
- 利用欧拉函数求出
- 取一个与互质的数
- 求出,使
- 加密钥匙为(e,n), 加密过程为
- 揭秘钥匙为(d,n), 加密过程为
随机得到 e 后求 d
- 由可得
- 根据扩展欧几里得求出 x,y
- x 即 d
核心代码
import { random, getDualPrime, gcd, ex_gcd } from '../common';
// 从素数表的[n - cnt, n]的范围内取值
const cnt = 100;
export function rsa(max: number) {
// 获取max以下的素数表
const primes = getDualPrime(max);
// console.log(`prime size = ${primes[0]}, last = ${primes[primes[0]]}`);
// 从素数表中随机选取两个素数
let p!: number;
let q!: number;
do {
p = primes[random(cnt, primes.length - 1)];
q = primes[random(cnt, primes.length - 1)];
} while (p === q);
// 根据p,q求出n,phi_n
const n = p * q;
const phi_n = (p - 1) * (q - 1);
// console.log(`p = ${p}, q = ${q}, n = ${n}, phi_n = ${phi_n}`);
// 随机取得与phi_n互质的数字e
let e!: number;
do {
e = random(Math.max(p, q) + 1, phi_n - 1);
} while (gcd(e, phi_n) !== 1);
// 利用扩展欧几里得求出d,使e * d % phi_n = 1
let { x: d } = ex_gcd(e, phi_n);
d = (d + phi_n) % phi_n;
// console.log(`e = ${e}, d = ${d}`);
// console.log(`${e} * ${d} % ${phi_n} == ${(BigInt(e) * BigInt(d)) % BigInt(phi_n)}`);
return {
e,
d,
n,
};
}