提问者:小点点

ECDH密钥交换与不同长度的公钥?


我目前正在研究ECDH密钥交换实现。我正在使用P-384曲线。其他曲线也是可能的,但我认为实现应该非常相似。

客户端(Javascript)和服务器(Java)希望找到一个共享的秘密,因此

1)服务器创建公钥和私钥。

2)服务器将公钥发送给客户端。注意:公钥长120字节。

3)客户端创建私钥和公钥。注意:公钥长97字节,私钥长48字节。

4)客户端尝试计算共享秘密。但是,我收到一个“坏参数”错误。

在客户端,我使用带有e2e包的Google-Closure-Library。(https://code.google.com/p/end-to-end/source/browse/javascript/crypto/e2e#e2e/ecc)

为了实现,我看了一下ecdh. js和ecdh_test.html文件。

我在客户端的实现如下所示:

var serverPublicKeyStringAsHex = "3076301006072a8648ce3d020106052b8104....." //*
var serverPublicKey = goog.crypt.hexToByteArray(serverPublicKeyStringAsHex)
var bobKeyPair = e2e.ecc.Protocol.generateKeyPair("P_384"); 
var bobECDH = new e2e.ecc.Ecdh("P_384");
var bobMessage = bobECDH.bob(serverPublicKey, bobKeyPair['privKey']);

我想知道这个错误是否会出现,因为服务器公钥的长度是错误的?如果这是原因,我的实现可能有什么问题?我在服务器端使用相同的EC。

通过这个“公钥长度”问题,我发现有未压缩和压缩的密钥表示。然而,我不认为这可能是我的问题,因为密钥长度(服务器公钥:120字节,客户端公钥:97字节)与描述的模式不匹配(字段大小1与2*字段大小1)

感谢您的任何帮助,因为我在这个问题上花了很多时间,不知道下一步我可以尝试什么…

*如果重要的是要知道,那就是完整的公钥:3076301006072a8648ce3d020106052b8104002203620004f87dc79943b20e0f57d61f8b7d02425baa4d1220b8b8c1e3596f5ab49ae6ad2acffad95e5860231821b4aeDree5cf1d0262563cffdc8dbe4f28973ebebf3985ba50c7b275888934dcd607007c288a5af1968345983cd7f01c548e5edca0b


共1个答案

匿名用户

这里有一个ASN.1编码的公钥(可能与X9.42兼容)。我假设JavaScript只是期望其中编码的未压缩点。因此,您需要解析ASN.1并检索公钥内偏移量23(十进制)处的未压缩点。