2014-09-25 64 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