2011-05-13 32 views
17

我在設備上使用SecKeyGeneratePair()在設備上生成了一個RSA對稱密鑰對。我有每個鍵的SecKeyRef結構指針。那麼,如何將SecKeyRef保存到磁盤?甚至傳輸它(我也想象也有正確的編碼問題)? Apple的「證書,密鑰和信任服務」指南說明在磁盤上保存SecKeyRef設備生成的公鑰/私鑰對

您可以將您的公鑰發送給任何人,然後他們可以使用它來加密數據。

我想特別保存私鑰;所以我可以在部署的設備上使用它來解密使用公鑰加密的數據。

P.S.我不介意每個密鑰的結果數據是DER編碼的ASN.1還是base-64;我只需要弄清楚如何從SecKeyRef中拔出鑰匙。我也很清楚OS X的SecKeychainItemExport()不存在。

回答

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。不知道它是否適用於私人密鑰。

+0

這項工作是否用於提取私鑰? – 2012-04-01 02:16:44

+0

沒有。我填寫了一個錯誤報告,但它從未被公認。 – 2012-04-01 08:42:21

+0

這個數據是如何編碼的?還是根本不? – 2013-01-27 17:44:19

0

請參閱證書,密鑰和信任服務編程指南中的Encrypting and Decrypting Data部分,該部分包含用於生成,保存和使用公鑰/私鑰對的代碼示例。