2

我使用 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==

4

1 回答 1

2

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-----”。

于 2011-08-07T11:43:04.090 回答