如何生成随机素数?

How to generate random prime number?

我目前正在从事一个涉及密码学的 JavaScript 团队项目。

我希望我的程序尽可能安全,如果可能的话达到行业级安全,因此我一直在寻找社区认可的随机大质数生成算法的实现。

我探索了 Node.js 加密,但我没有找到一个简单的函数 returns 一个随机的大概率素数。

如何使用 Node.js 加密来解决这个问题?

createDiffieHellman 来自 Node 的加密模块可以做到这一点:

const crypto = require('crypto');

let DH = crypto.createDiffieHellman(16); // bit length

let prime = DH.getPrime('hex');
let dec = parseInt(prime, 16);

console.log('prime:', prime); // prime: c803
console.log('dec:', dec); // dec: 51203

从 v15.8.0 开始 Node.js 内置 crypto 模块提供 generatePrime and generatePrimeSync 方法。

例如生成16位质数使用:

const crypto = require('crypto');

let prime = crypto.generatePrimeSync(16, {bigint: true}); // 49597n

由于计算大素数需要时间,因此还有一个带回调的异步选项:

const crypto = require('crypto');

crypto.generatePrime(16, {bigint: true}, (err, prime) => {
    console.log(prime); // 60757n
});

注意:bigint 选项用于 return 一个 bigint 而不是 ArrayBuffer