【问题标题】:How to get public key from private key stored in HSMs如何从存储在 HSM 中的私钥中获取公钥
【发布时间】:2019-06-11 16:54:05
【问题描述】:

我有一些私钥存储在 HSM 中,但没有公钥。我想通过PKCS11接口获取对应的公钥。

如果私钥是 RSA 密钥,我可以从 CKA_MODULUS 中提取模数,从 CKA_PUBLIC_EXPONENT 中提取指数,然后用这两个数字构造公钥。

但是,对于 ECDSA(或 DSA)密钥,我怎样才能实现相同的目标?
CKA_EC_POINT 属性不适用于私钥。
我想我能得到的唯一有用的信息就是它来自CKA_EC_PARAMS的曲线参数,这还不足以得到公共点。

【问题讨论】:

  • 应该可以从签名计算公钥(我自己从来没有尝试过)......见例如here
  • @vlp 这个方法看起来很有趣!但我不能完全理解……我不理解史蒂夫·米切尔和简·莫里茨所说的两个罕见的案例。如果我尝试使用两个或更多签名来恢复公钥,我是否更有可能恢复正确的公钥?
  • 我想是的。可能值得在crypto SE 上搜索/询问。 This code 用于从单一颁发的证书中获取捷克国民身份证 CA 的公钥(CA 公钥未公开发布,请参阅here)。 Bouncy castle 有一个很好的用于 EC 计算的 API。
  • @vlp 这个消息很有趣!是的,我在 C# 中使用 Bouncycastle。我将尝试编写一些代码来重现公钥。

标签: hsm pkcs#11


【解决方案1】:

如果您使用的是实现 PKCS#11 specification v2.40 的 PKCS#11 库,那么您正在寻找 CKA_PUBLIC_KEY_INFO 属性。

如果您使用的是实现早于 2.40 的 PKCS#11 规范的 PKCS#11 库,则您无法从 EC 私钥对象中读取 EC 公钥值,除非您的设备供应商提供一些类似于 CKA_PUBLIC_KEY_INFO 属性的供应商特定属性。

【讨论】:

  • 我不知道 PKCS#11 库实现了哪个版本,也不知道如何区分版本...我尝试使用 Pkcs11Interop 在 C# 中读取 CKA_PUBLIC_KEY_INFO,似乎可以读取该属性 (CannotBeRead=false),但 GetAttributeAsByteArray 返回一个空数组。这是否意味着 PKCS#11 库没有实现规范 v2.40?
  • @JemmyLoveJenny 由您的 PKCS#11 库实现的 PKCS#11 标准版本可以使用以下代码读取:pkcs11Library.GetInfo().CryptokiVersion
  • 检查了你的代码,该库支持 v2.40 规范。在 v2.40 规范中,它说 CKA_PUBLIC_KEY_INFO “(可能为空,DEFAULT 派生自底层公钥数据)”。就我而言,该属性为空。所以这个属性的结果似乎随着 PKCS#11 库的实现而变化。这不是我期望的可靠方式...
猜你喜欢
  • 2012-01-02
  • 2017-12-23
  • 2014-02-16
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
相关资源
最近更新 更多