2010-01-25 48 views
2

我正在尋找.NET應用程序和嵌入式設備之間的密鑰交換解決方案。兩個端點具有共享密鑰,使得橢圓曲線Diffie-Hellman(ECDH)算法非常適合安全地交換會話的主密鑰。什麼是具有ECDiffieHellmanCng兼容實現的C++庫?

有一個很好的C++庫,crypto++,它實現了ECDH並且適用於嵌入式設備。但是,ECDH的實現與Mirosoft的ECDiffieHellmanCng實現不同(正如其暗示的FAQ)。我們希望保持與.NET安全算法的兼容性,以便我們可以堅持用於PC應用程序的託管代碼(現在,或者如果我們使用CNG,當我們有一天放棄XP時)。

有沒有人看到除微軟以外的兼容微軟的實現?或者,.NET代碼和嵌入式C++代碼之間是否還有其他良好的密鑰交換解決方案,以便與預共享密鑰一起使用?

更新2010-01-27:爲了澄清,我試圖使用ECDH在不相互信任的兩個ad-hock端點之間執行雙向身份驗證和密鑰交換,直到他們看到他們共享同一個祕密。這與藍牙配對方案類似,其中共享機密是在帶外交換的(除非我的情況下設備可能不在彼此附近)。

+0

您鏈接到的FAQ是Peter Gutmann的cryptlib的常見問題解答 - 不適用於crypto ++。 – 2010-01-25 19:22:36

+0

好的修正。常見問題解答條目最好是作爲一般性警告,您不能假設相同的通用cryto算法的兩個實現可以相互協作。我希望有人碰巧知道是什麼。 – 2010-01-25 19:46:32

回答

0

OPENSSSL具有端口到Visual Studio

+0

我的第一選擇是使用.NET Framework中已有的東西,這就是爲什麼我關注互操作性,而不僅僅是可移植性。 – 2010-01-25 19:48:12

1

對於互操作性你使用RSA更好。由於專利雷區,您不會找到許多免費的ECC實施。

如何讓一方產生一個隨機密鑰,用另一方的公鑰加密並用自己的私鑰簽名。然後另一方可以驗證簽名並解密共享密鑰。

如果您擔心重播攻擊(請注意,您計劃使用的ECDH方案並不能防止這些攻擊 - 除非您打算使用短暫密鑰),您可以雙方都生成一個隨機密鑰,並對其進行加密與另一方的公共密鑰,然後以某種方式組合這兩個密鑰。

更好的可能是使用一些標準協議:考慮TLS與客戶端證書驗證。您可以硬編碼客戶端和服務器證書。

+0

ECDH方案通過爲每個主密鑰交換添加新的隨機素材來防止重放攻擊。在.NET中,ECDiffieHellmanCng構造函數生成隨機數。 我喜歡你的RSA想法,但存在如何驗證的問題(對不起,我可能對此不太清楚)。雙方都有共同的祕密,但都不相信對方不會成爲冒充者。 我相信基於證書的身份驗證是不切實際的,因爲可能有成千上萬的雙方唯一的實例,除了擁有共享密鑰外,這些實例是不可信的。 – 2010-01-26 20:04:38