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

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

使用了Node.js加密模块,但它没有提供调用ECDG.generateKeys()方法时生成基点的方法(基于猜测,因为本主题中的文档不太清楚)。

规范中已经定义了基点吗?

关于此的任何想法将非常有帮助!

最佳答案

与其他非对称原语(例如RSA和标准DH)相比,ECC密码学确实非常快。但是,生成曲线的域参数确实很慢。即使是较小的位,也要花几个小时。因此,通常,曲线参数是从一组已知的命名曲线中选择的。已知的大多数曲线都在Daniel Daniel。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相乘后,您将获得公共点W,这将完成一组参数以执行基于EC的加密。

10-05 19:16