我使用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 ==
答案 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 -----”。