我尝试在2个对等体之间建立椭圆曲线Diffie-Hellman(ECDH)协议,1个在Node.js应用程序中运行,另一个在C应用程序中运行。
为了做到这一点,我决定在Node.js中建立初始参数(曲线和基点),然后将它们传递给C app(基本上抽象出协议过程)。
正在使用Node.js 加密模块但它没有提供在调用ECDG.generateKeys()
方法时获取生成基点的方法(基于猜测,因为文档不是很清楚)这个主题)。
规范中是否已定义基点?
对此的任何想法都会非常有用!
答案 0 :(得分:3)
与其他非对称基元(如RSA和标准DH)相比,ECC加密技术非常快。但是,为曲线生成域参数确实很慢;想想小时候的小时数。因此,通常曲线参数选自一组已知的命名的曲线。大多数已知的曲线都在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)曲线( 3)prime(1)prime256v1(7)} in full)。
对于Node.JS,您在为这些参数生成密钥对之前选择了参数(包括曲线和基点)::
const alice = crypto.createECDH('secp521r1');
const aliceKey = alice.generateKeys();
第一个已设置所有6/7域参数。密钥生成然后简单地为私钥生成随机秘密值s
。在与基点G
相乘后,您将获得公共点W
,这将完成用于执行基于EC的加密的参数集。
答案 1 :(得分:1)
所以,我对这个主题做了一些更多的研究,发现根据NIST规范,每条曲线已经定义了一个基点作为预定义参数之一。我想Node.js Crypto实现遵循这个规范,所以不必费心去传递这个参数。