我目前正致力于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%2Fecc)
为了实现,我查看了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。
我发现这个"public-key-length"问题,有未压缩和压缩的密钥表示。但是,我不认为这可能是我的问题,因为关键长度(服务器公钥:120字节,客户端公钥:97字节)与所描述的模式不匹配(字段大小+ 1对比2 *字段大小+ 1)
感谢您提供任何帮助,因为我已经花了这么多时间解决这个问题而且不知道接下来会尝试什么......
*如果知道重要的话,那就是完整的公钥: 3076301006072a8648ce3d020106052b8104002203620004f87dc79943b20e0f57d61f8b7d02425baa4d1220b8b8c1e3596f5ab49ae6ad2acffad95e5860231821b4aedefe5cf1d0262563cffdc8dbe4f28973ebebf3985ba50c7b275888934dcd607007c288a5afaf196834395983cd7f01c548e5edca0b
答案 0 :(得分:3)
这里有一个ASN.1 encoded public key(可能与X9.42兼容)。我认为JavaScript只是期望在其中编码的未压缩点。因此,您需要解析ASN.1并检索公钥中偏移量23(十进制)的未压缩点。