2016-08-30 63 views
1

我創建使用牡丹:連載ECDH私鑰

Botan::EC_Group ecgroup("brainpool512r1"); 
    Botan::ECDH_PrivateKey privKey(CBotanInitEx::RNG(), ecgroup); 

新的密鑰對

嘗試使用PKCS#8序列化,按照建議在這裏(相對於RSA,這是快!) : https://botan.randombit.net/manual/pubkey.html#serializing-public-keys

datPubKey = Botan::X509::BER_encode(privKey); 
    txtPubKey = Botan::X509::PEM_encode(privKey); 

    datPrivKey = Botan::PKCS8::BER_encode(privKey, CBotanInitEx::RNG(), pwd); 
    txtPrivKey = Botan::PKCS8::PEM_encode(privKey, CBotanInitEx::RNG(), pwd); 

我得到一個異常:

PK algo ECDH has no defined OIDs 

即使牡丹初始化並通過這條線:

add_oid(config, "1.3.36.3.3.2.8.1.1.13", "brainpool512r1"); 

如何序列化一個ECDH_PrivateKey?

+0

曲線的OID與密鑰類型的OID不同。你爲什麼*需要*序列化ECDH密鑰?靜態DH沒有那麼用。或者你是否將它用於ECDSA(不同的算法,相同的密鑰類型)? –

+0

猜猜我需要閱讀我實際上在做什麼 - 所有的TLA..FLA都在讓我的腦袋旋轉。我來自現有的RSA公鑰「示例」,其中密鑰被序列化以用於端點之間的交換。 – peterchen

回答

1

RSA - 您以前的算法 - 用於認證/簽名,所以我會在這裏假設ECDSA。在這種情況下,您應該使用ECDSA_PrivateKey而不是ECDH_PrivateKey。 ECDSA可用於身份驗證和簽名,而ECDH則用於密鑰協議。

Diffie-Hellman密鑰協議通常在沒有靜態密鑰對的情況下執行(ECDHE中的E和SSL/TLS密碼組中的DHE代表短暫)。所以應該沒有理由序列化/存儲密鑰協議的私鑰。

從某種意義上說,如果您需要序列化,您需要提前思考並質疑自己。如果不需要序列化,您不應該序列化密鑰 - 尤其是私人密鑰。相反,你可以傳遞對象句柄。

+0

謝謝!我剛剛意識到我的問題是非常錯誤的 - 其目的是在可信設備上創建一個祕密的隨機「身份」,並使用公鑰對其進行加密以安全傳輸。所以這些密鑰至少在每個設備版本中都是持久的。由於設備性能要求較低,EC優於RSA。我現在認爲ECDH是「正義」的關鍵協議,但我檢查的庫提供ECDH(E)和ECDSA進行簽名 - (默認)EC公鑰加密似乎是ECIES,但沒有我檢查的庫提供它(在那個名字)。 – peterchen

+1

@peterchen對於ECIES,它似乎需要保存接收者的DH私鑰(如果只是在庫的函數內)。然而,對Botan和ECIES的搜索確實也爲我返回了零結果(在您撰寫評論之前)。您可能會檢查出ElGamal加密,但請注意RSA加密 - 使用RSA公鑰 - 相對有效*,這是RSA解密(當然還有密鑰生成),需要花費大量時間。 –