有没有办法在 node.js 加密模块上获得用于 ECDH 的基点 (P)?

Is there anyway to get the base point (P) used for ECDH on node.js Crypto module?

我正在尝试在 2 个对等点之间建立椭圆曲线 Diffie-Hellman (ECDH) 协议,1 个 运行 在 Node.js 应用程序中,另一个在 C 应用程序中。

为了做到这一点,我决定在Node.js端建立初始参数(曲线和基点),然后将它们传递给C app(基本上抽象了协议过程)。

Node.js Crypto 模块正在使用,但它不提供获取调用 ECDG.generateKeys() 方法时生成的基点的方法(基于猜测,因为该主题的文档不是很清楚)。

规范中是否已经定义了基点?

对此的任何想法都会非常有帮助!

所以,我对这个话题做了更多的研究,发现根据 NIST 规范,每条曲线都已经定义了一个基点作为预定义参数之一。我想 Node.js 加密实现遵循此规范,因此根本不必费心传递此参数。

与其他非对称原语(例如 RSA 和标准 DH)相比,ECC 密码术确实非常快。然而,为曲线生成域参数真的很慢;即使对于更小的比特大小也要考虑几个小时。所以通常曲线参数是从一组已知的命名曲线中选择的。大多数已知的曲线都在 Daniel J. Bernstein 教授和 Tanja Lange 教授的 the safe curves website 上。

通常在协议中使用的曲线总是特定类型,例如F(p) 上的曲线称为素曲线。然后选择一组域参数,例如NIST 标准化曲线。最后建立域参数集。通常这是通过名称(例如 NIST P-256)或 ID(例如 1.2.840.10045.3.1.7 或 {iso(1) member-body(2) us(840) ansi-x962(10045) curves( 3) prime(1) prime256v1(7)}完整)。

对于 Node.JS,您在生成密钥对之前选择了参数(包括曲线和基点)对于这些参数:

const alice = crypto.createECDH('secp521r1');
const aliceKey = alice.generateKeys();

第一个已经设置了所有 6/7 域参数。密钥生成然后简单地为私钥生成一个随机秘密值 s。与基点 G 相乘后,您将得到 public 点 W,这完成了执行基于 EC 的密码学的参数集。