【问题标题】:Botan: serialize ECDH private keyBotan:序列化ECDH私钥
【发布时间】:2017-01-06 13:50:48
【问题描述】:

我使用

创建了一个新的密钥对
  Botan::EC_Group ecgroup("brainpool512r1");
  Botan::ECDH_PrivateKey privKey(CBotanInitEx::RNG(), ecgroup);

(与 RSA 相比,速度更快!)

按照此处的建议,尝试使用 PKCS#8 对其进行序列化: 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?

【问题讨论】:

  • 曲线的OID与键类型的OID不同。为什么您需要序列化 ECDH 密钥?静态 DH 的使用并不多。还是您将其用于 ECDSA(不同的算法,相同的密钥类型)?
  • 我想我需要了解一下我实际在做什么——所有的 TLA..FLA 都让我头晕目眩。我来自现有的 RSA 公钥“示例”,其中密钥被序列化以在端点之间进行交换。

标签: c++ cryptography botan


【解决方案1】:

RSA - 你以前的算法 - 用于身份验证/签名,所以我在这里假设 ECDSA。在这种情况下,您应该使用ECDSA_PrivateKey 而不是ECDH_PrivateKey。 ECDSA 可用于身份验证和签名,而 ECDH 用于密钥协商。

Diffie-Hellman 密钥协商通常在没有静态密钥对的情况下执行(ECDHE 中的 E 和 SSL/TLS 密码套件中的 DHE 代表 ephemeral)。所以应该没有理由为密钥协议序列化/存储私钥。

从某种意义上说,您确实需要提前思考并质疑自己是否需要序列化。如果不需要序列化,则不应序列化密钥——尤其是私钥。相反,您可以只传递对象句柄。

【讨论】:

  • 谢谢!我刚刚意识到我的问题是完全错误的 - 目的是在受信任的设备上创建一个秘密的随机“身份”,并用公钥对其进行加密以安全传输。因此,密钥至少在每个设备版本中都是持久的。 EC 将优于 RSA,因为对设备的性能要求较低。我现在认为 ECDH 是“只是”密钥协议,但我检查的库提供 ECDH(E) 和 ECDSA 进行签名 - (默认)EC 公钥加密似乎是 ECIES,但我检查的库都没有提供它(在那个名字)。
  • @peterchen 对于 ECIES,它确实似乎需要保存接收器的 DH 私钥(如果只是在库的函数中)。但是,搜索 Botan 和 ECIES 对我来说也确实返回了零结果(在你写评论之前)。您可以查看 ElGamal 加密,但请注意,使用 RSA 公钥的 RSA 加密相对有效,它是 RSA 解密(当然还有密钥生成)需要大量时间。