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