2011-08-07 63 views
2
支持

我创造密钥对iOS上使用SecKeyGeneratePair然后出口键来公钥和专用密钥使用SecItemCopyMatching的(Base64当然出口之前编码)。现在我遇到了使用公钥加密数据的问题。我使用下一个OpenSSL命令:公钥不通过的OpenSSL

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

我从OpenSSL得到“无法加载公钥”响应。

我已经分析了公钥,发现它只包含一个内容:

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生成(用HEX编辑和固定序列长度)公钥创建额外的ASN.1结构。它的格式是正确的(我已经在这里检查了http://lapo.it/asn1js/),但是我仍然不能将它用于OpenSSL。看起来像是因为SecItemCopyMatching返回的公钥丢失了字节。

我检查专用密钥的内容还,因为它里面包含公钥。 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 ==

+0

下面是一个Objective-C代码片段:http://blog.wingsofhermes.org/?p=42如果没有编码的方法,我还没有看到它。 Tim –

回答

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格式与“-----开始RSA公共密钥-----”和“-----结束RSA公共密钥-----”围绕Base64数据。

+0

是的,我知道OpenSSL需要确切的结构。没有任何细节,OpenSSL只是说“无法加载公钥”。我试过“openssl rsautl -encrypt -inkey publicKey-updated -pubin -in text.txt -out text.enc”命令 – gN0Me

+0

你可以发布你创建的公钥吗(带有额外的PEM头文件和AlgorithmIdentifier)?您应该只尝试使用您的结构,而不是上面发布的原始RSA公钥。 –

+1

我试图再次创建几个密钥对。它们全部拥有1024位公钥,看起来像是1023位包被消失了。我手动添加了强制ASN.1字段,现在OpenSSL完美工作!看起来第一把钥匙在发电过程中受损。谢谢你,omrib! – gN0Me