将openssl生成的RSA私钥加载到MacOS SecKeyRef失败

时间:2017-05-26 06:56:02

标签: ios macos security openssl

我正在开发一个需要将RSA私钥(DER格式)读入MacOS的SecKeyRef对象的项目。

我通过

生成密钥
openssl genrsa -out private.pem 1024
openssl rsa -in private.pem -outform DER -out private.der

我使用SecKeyCreateWithData:

将private.der加载到MacOS
unsigned char *keyBytes; // contains all the bytes from the file "private.der"
int keyBytesLen; // length of the data loaded
NSData keyData = [NSData dataWithBytes:keyBytes length:keyBytesLen];
NSDictionary* options = @{(id)kSecAttrKeyType: (id)kSecAttrKeyTypeRSA, 
                          (id)kSecAttrKeyClass: (id)kSecAttrKeyClassPrivate,
                          (id)kSecAttrKeySizeInBits: @1024};
SecKeyRef privateKey = SecKeyCrecateWithData((__bridge CFDataRef) keyData, (__bridge CFDictionaryRef) options, &error);

OSstatus status = SecKeyDecrypt(privateKey, .... some encrypted message);
// status returns -50 (errSecParam)

所以我注意到privateKey已成功加载,但无法解密加密的邮件。我100%确定我在SecKeyDecrypt()函数中放入的其他参数是正确的,因为如果我通过macOS的内置函数生成privateKey而不是从openssl生成的DER格式文件加载,它就可以工作。

我还注意到,当我转储密钥(二进制格式)时,前几个字节(版本标题)与MacOS的内置函数和openssl生成的密钥不同。如果密钥由MacOS生成(例如:SecKeyGeneratePair)并且由SecKeyCopyExternalRepresentation输出,则前几个字节如下所示:

3082 025d 0201 0002 8181 ...

而openssl生成的密钥如下:

3082 025c 0201 0002 8181 ...

我知道(基于PKCS#1)这些字节代表私钥的“版本”,但不确定如何解释它。

任何将openssl生成的密钥加载到MacOS API的帮助或类似工作示例都将受到赞赏

0 个答案:

没有答案