2014-09-25 275 views
2

我正在研究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']); 

如前所述,我在控制台得到一个“错误的参数”的错误。 更详细: Screenshot of the FF-console

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

有了这个"public-key-length"问题我发现,有没有压缩和压缩表示的键。但是,我不认为这可能是我的问题,因为关键长度(服务器公钥:120字节,客户端公钥:97字节)与描述的模式不匹配(字段大小+1与2 *字段大小+ 1)

感谢任何形式的帮助,因为我已经花了这个问题这么多小时,不知道有什么我可以尝试下..

*如果是要知道重要的,这是完整的公钥: 3076301006072a8648ce3d020106052b8104002203620004f87dc79943b20e0f57d61f8b7d02425baa4d1220b8b8c1e3596f5ab49ae6ad2acffad95e5860231821b4aedefe5cf1d0262563cffdc8dbe4f28973ebebf3985ba50c7b275888934dcd607007c288a5afaf196834395983cd7f01c548e5edca0b

回答

3

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

+0

很好的答案,非常感谢!我对ASN.1不知道 – crypton00b 2014-09-26 12:37:03