OpenSSL不支持iOS的PublicKey

时间:2011-08-07 10:45:47

标签: iphone ios openssl rsa asn.1

我使用SecKeyGeneratePair在iOS上创建了密钥对,然后使用SecItemCopyMatching(导出前的Base64编码)将密钥导出到publicKey和privateKey。现在我使用公钥加密数据时遇到问题。我使用下一个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设备上生成的密钥对:

publicKey:

  

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

privateKey:

  

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

1 个答案:

答案 0 :(得分: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 -----”。