【问题标题】:PublicKey from iOS doesn't supported by OpenSSLOpenSSL 不支持来自 iOS 的 PublicKey
【发布时间】:2011-08-07 10:45:46
【问题描述】:

我使用 SecKeyGeneratePair 在 iOS 上创建了密钥对,然后使用 SecItemCopyMatching 将密钥导出到 publicKey 和 privateKey(当然在导出之前进行 Base64 编码)。现在我在使用公钥加密数据时遇到了问题。我使用下一个 OpenSSL 命令:

openssl rsautl -encrypt -inkey publicKey -pubin -in text.txt -out text.enc

我收到来自 OpenSSL 的“无法加载公钥”响应。

我分析了 publicKey 并注意到它只包含下一个内容:

SEQUENCE(2 elem)
|  INTEGER(1023 bit)
|  INTEGER 65537

当 OpenSSL 生成的公钥包含有关算法的附加信息时,例如由 OpenSSL 创建的样本:

SEQUENCE(2 elem)
| SEQUENCE(2 elem)
| | OBJECT IDENTIFIER 1.2.840.113549.1.1.1
| | NULL
| BIT STRING(1 elem)
| | SEQUENCE(2 elem)
| | | INTEGER(1024 bit)
| | | INTEGER 65537

第一个问题是为什么 publicKey 只包含 1023 位的密钥?为此,OpenSSL 的公钥长度为 1024 位。

我尝试为 iOS 生成的 publicKey 创建额外的 ASN.1 结构(使用 HEX 编辑器并修复 SEQUENCE 长度)。它的格式是正确的(我在这里检查过http://lapo.it/asn1js/),但我仍然不能将它用于OpenSSL。看起来是因为 SecItemCopyMatching 返回的公钥丢失了字节。

我也检查了 privateKey 的内容,因为里面包含了 publicKey。 publicKey的长度也有1023位。

你能帮帮我吗?提前致谢。这是在 iOS 设备上生成的密钥对:

公钥:

MIGIAoGAaXp7vlZ5WmCzaL1rrBKXC8rJuc7EpH7Us/0t4R3hJoDOtRJxywegPY6wm45Oiud7UDh+9loebAg4dcpUP1le5SkbxrC9Qp8XahmvYVMXUYVGDiLTWID3e3PdE7CwEM5/lz1c1vRRWjR+2GzvV4xf5gRwCzZW1tXvXCNWsraqwE8CAwEAAQ==

私钥:

MIICWwIBAAKBgGl6e75WeVpgs2i9a6wSlwvKybnOxKR+1LP9LeEd4SaAzrUSccsHoD2OsJuOTorne1A4fvZaHmwIOHXKVD9ZXuUpG8awvUKfF2oZr2FTF1GFRg4i01iA93tz3ROwsBDOf5c9XNb0UVo0fths71eMX+YEcAs2VtbV71wjVrK2qsBPAgMBAAECgYBolCowc2hqdUosZPJmbyAXbv5HHXzWY3Hc6v8cHhXnqPpJiXoNhQgZQGpWMOgqzIv0467t7jgPgK8KCosxLBjqvQTVzBkHTsBpBAaJgxzgP04pD8EnJp6uwwx8fZcP3PQOwGkmtWf2KyAcBZD3A+snCxGTRMDOrEPzQe6kBapBwQJBASG9Go92pjIqTRMMam5A5oUt9R1/iNx0wHowStyf2KHik1GRidaENIYkobZEzjKEbskcq3LGJGna163uu/Y55l8CQF0yLFHBdMi9hYX49s8Abzkd+3sGI29hFkLrL01ZB2xV/WceNLQH7jxplRClri9Ccr1QFkMGcaXRv2X+eNu6DBECQQEdlTxZzhQwfBtuPB2nwNa2zL6+rZdj3Lxfc7xGTFQF9MNKcg6P3825rt+qPZWUm45rMpQXVBBOOkO+kAK6xwU3AkBIE8vPFy25K0qfSOOpSQ68QAIFLcQuGgpbiwU0bwycrwyiuevM6O1J7+aHz3udtWiEHfJ5t/whYM0ElwDl/0fhAkEAq0EWoY8mQjHAGPMIhIty48fDbJCeFWFPx8lR+gegR1KwcIzcCGrYnHt8ihrfPm9ySjXwWDLYhBx0A5m+IbRZaA==

【问题讨论】:

  • 这里有一个 Objective-C 代码 sn-p 可以做到这一点:blog.wingsofhermes.org/?p=42 如果有办法不用编码就可以做到,我还没有看到。蒂姆

标签: iphone ios openssl rsa asn.1


【解决方案1】:

OpenSSL 需要 X.509 格式的密钥(请参阅 RFC 3280):

 SubjectPublicKeyInfo  ::=  SEQUENCE  {
        algorithm            AlgorithmIdentifier,
        subjectPublicKey     BIT STRING  }

   AlgorithmIdentifier  ::=  SEQUENCE  {
        algorithm               OBJECT IDENTIFIER,
        parameters              ANY DEFINED BY algorithm OPTIONAL  }

“subjectPublicKey”字符串取决于算法。对于 RSA,它是 (RFC 3447):

  RSAPublicKey ::= SEQUENCE {
      modulus           INTEGER,  -- n
      publicExponent    INTEGER   -- e
  }

我认为密钥是 1023 而不是 1024 位不是问题。但是您可以尝试生成更多,看看它们是否都是 1023 位长。

当您尝试使用自己的创建(更新的 ASN.1 结构)时,OpenSSL 会说什么?可以发在这里吗?

此外,OpenSSL 期望它采用 PEM 格式,并在 Base64 数据周围使用“-----BEGIN RSA PUBLIC KEY-----”和“-----END RSA PUBLIC KEY-----”。

【讨论】:

  • 是的,我知道 OpenSSL 需要确切的结构。 OpenSSL 只是说“无法加载公钥”而没有任何细节。我试过“openssl rsautl -encrypt -inkey publicKey-updated -pubin -in text.txt -out text.enc”命令
  • 您能否发布您创建的公钥(带有额外的 PEM 标头和 AlgorithmIdentifier)?您应该只尝试使用您的结构,而不是您在上面发布的原始 RSA 公钥。
  • 我尝试再次创建几个密钥对。它们都有 1024 位公钥,看起来 1023 位包消失了。我已经手动附加了强制 ASN.1 字段,现在 OpenSSL 可以完美运行!看起来第一把钥匙在生成过程中被损坏了。谢谢你,omrib!
  • 我实际上并没有做任何事情,但我很高兴听到它现在正在工作:-)
  • @gN0Me 您能否更详细地解释一下您是如何手动附加强制 ASN.1 字段的?我有这个完全相同的问题,我很卡在atm:\
猜你喜欢
  • 2013-04-25
  • 2015-02-24
  • 2017-03-12
  • 1970-01-01
  • 2017-04-25
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多