我正在尝试使用crypto 模块在 Node.js 和使用Web Cryptography API的 Web 客户端之间完成密钥交换。
到目前为止,我设法将密钥交换处理到在服务器和客户端上派生共享密钥的地步。在服务器端,我使用了“secp521r1”曲线,在客户端使用了名为“P-521”的等效曲线。
在客户端上,我收到一个长度为 32 字节的共享密钥,我认为这是 256 位 AES-GCM 密钥的正确长度。但在服务器上,我收到一个长度为 66 字节的密钥。下面是生成的密钥的两个示例,一个以 base64 编码,一个为字节数组:
Base64 encoded:
Client AES-Key: AJQQpnOjNe2/QQz5T9NmSPFpFgUG/20739EhdjVt//I=
Server AES-Key: AJQQpnOjNe2/QQz5T9NmSPFpFgUG/20739EhdjVt//LYZ+XeuTgkwv7CJFQrqNWxnny8R+VP3nJuk1SUyDJsa7+f
Byte array:
Client AES-Key: 0,249,8,221,38,57,84,243,202,83,90,68,4,41,49,224,69,89,162,74,47,72,134,169,32,3,133,55,109,105,144,249
Server AES-Key: 0,249,8,221,38,57,84,243,202,83,90,68,4,41,49,224,69,89,162,74,47,72,134,169,32,3,133,55,109,105,144,249,66,66,131,19,81,11,27,161,132,7,244,2,191,221,162,169,247,108,128,229,211,217,109,78,5,71,232,252,243,36,214,42,199,175
我想我在 Node.js 上错误配置了一些东西,但我在文档中找不到任何关于如何正确操作的提示。
这是我在 Node.js 上提取密钥的方法:
var ecdh = crypto.createECDH('secp521r1');
ecdh.generateKeys();
ecdh.getPublicKey('base64'); // passed this to the client
// After I receive the public key of the client
var shared = ecdh.computeSecret(clientPublicKey, 'base64');
我的问题是:
- 我的假设是否正确,来自 Node.js 的密钥不正确?
- 我需要做什么才能正确提取 AES-GCM 256 位密钥?
- 电流输出是什么意思?
任何指导表示赞赏。