我在设备上使用SecKeyGeneratePair()
在设备上生成了RSA对称密钥对。我为每个键都有SecKeyRef
个struct指针。那么,如何将SecKeyRef
保存到磁盘?甚至传输它(我也想象有正确编码的问题)? Apple的“证书,密钥和信任服务”指南说明
您可以将您的公钥发送给任何人,然后他们可以使用它来加密数据。
我想特别保存私钥;所以我可以在部署的设备上使用它来解密用公钥加密的数据。
P.S。我不介意每个密钥的结果数据是DER编码的ASN.1还是base-64;我只需要弄清楚如何从SecKeyRef
中取出密钥。我也很清楚OS X的SecKeychainItemExport()
不存在。
答案 0 :(得分:10)
SecItemCopyMatching()
获取公钥的字节数。
- (NSData *)getPublicKeyBits {
OSStatus sanityCheck = noErr;
NSData * publicKeyBits = nil;
NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init];
// Set the public key query dictionary.
[queryPublicKey setObject:(id)kSecClassKey forKey:(id)kSecClass];
[queryPublicKey setObject:publicTag forKey:(id)kSecAttrApplicationTag];
[queryPublicKey setObject:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];
[queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnData];
// Get the key bits.
sanityCheck = SecItemCopyMatching((CFDictionaryRef)queryPublicKey, (CFTypeRef *)&publicKeyBits);
if (sanityCheck != noErr)
{
publicKeyBits = nil;
}
[queryPublicKey release];
return publicKeyBits;
}
以上内容来自Apple的CryptoExercise。不确定它是否适用于私钥。
答案 1 :(得分:1)
您可以使用iOS的最新加密API,可以将密钥另存为NSData并从NSData检索密钥
SecKeyRef key = <# a key #>;
CFErrorRef error = NULL;
NSData* keyData = (NSData*)CFBridgingRelease( // ARC takes ownership
SecKeyCopyExternalRepresentation(key, &error)
);
if (!keyData) {
NSError *err = CFBridgingRelease(error); // ARC takes ownership
// Handle the error. . .
}
答案 2 :(得分:0)
请参阅“证书,密钥和信任服务编程指南”的Encrypting and Decrypting Data部分,其中包含用于生成,保存和使用公钥/私钥对的代码示例。