我正在研究ECDH密钥交换实施。我正在使用P-384曲线。其他曲线也是可能的,但我认为这些实现应该非常相似。ECDH与不同长度的公钥进行密钥交换?
客户端(JavaScript)的和服务器(JAVA)想找到一个共享的秘密,因此
1)服务器创建一个公钥和私钥。
2)服务器将公钥发送给客户端。 注意:公钥是120字节长。
3)客户端创建私钥和公钥。 注意:公钥是97字节长和私钥有48个字节。
4)客户端尝试计算共享密钥。但是,我收到“错误的参数”错误。
在客户端,我使用Google-Closure-Library和e2e软件包。 (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
很好的答案,非常感谢!我对ASN.1不知道 – crypton00b 2014-09-26 12:37:03