我正在开发一个需要将RSA私钥(DER格式)读入MacOS的SecKeyRef对象的项目。
我通过
生成密钥openssl genrsa -out private.pem 1024
openssl rsa -in private.pem -outform DER -out private.der
我使用SecKeyCreateWithData:
将private.der加载到MacOSunsigned 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的帮助或类似工作示例都将受到赞赏