2012-09-07 174 views
12

我工作的iOS應用程序的base64 SecKeyRef,我得到一個base64編碼公鑰如:得到編碼字符串

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3gn +口令是tJ1 + PbP0GHa6hmM35WsVyibpypWAwRuBYY4MGfh3VWoXgiyiLo5HJTW1eR9BUFq3z + yOG1rwzSabZ8I4zneWm0kH7xErSjNrMbmjirbL7e6TQNa1ujP/x4x9XVbqf3vIsNVs19kn/QSX/HGzd5Ct3TGAo0AT0T4JwkCfciwIDAQAB

我想使用此公鑰對某些文本進行編碼,但我找不到將此字符串轉換爲有用公鑰的方法。

我需要做什麼?

+0

您可能必須['SecItemAdd',然後是'SecItemCopyMatching'](https://developer.apple.com/library/ios/#documentation/security/conceptual/keychainServConcepts/iPhoneTasks/iPhoneTasks.html)來執行此操作。 – bobobobo

+0

[另見](http://blog.flirble.org/2011/01/05/rsa-public-key-openssl-ios/) – bobobobo

+0

你有沒有得到你的問題的答案? – Devarshi

回答

10

首先,你必須的base64解碼你的NSString NSData的: 解決辦法見this answer。如果您正在開發iOS 7,則可以使用initWithBase64EncodedString::options

將字符串解碼爲NSData後,您可以嘗試從中創建證書。您收到的證書格式很重要 - 您可以使用DER(這是常用的)或PKCS12。您很可能將其作爲DER獲得,所以我認爲您需要指導。

創建證書和政策:

SecCertificateRef cert = NULL; 
SecPolicyRef  policy = NULL; 

cert = SecCertificateCreateWithData(kCFAllocatorDefault, data); 
policy = SecPolicyCreateBasicX509(); 

如果cerificate數據是不正確的格式傳遞給SecCertificateCreateWithData時,你會得到一個空的結果。

此時你有證書,但沒有公鑰。要獲得公鑰,您必須獲得證書的create a trust reference and evaluate the trust

OSStatus  status  = noErr; 
SecKeyRef  *publicKey = NULL; 
SecTrustRef  trust  = NULL; 
SecTrustResultType trustType = kSecTrustResultInvalid; 

if (cert != NULL){ 
    SecCertificateRef certArray[1] = {cert}; 
    certs = CFArrayCreate(kCFAllocatorDefault, (void *)certArray, 1, NULL); 
    status = SecTrustCreateWithCertificates(certs, policy, &trust); 

    if (status == errSecSuccess){ 
     status = SecTrustEvaluate(trust, &trustType); 

     // Evaulate the trust. 
     switch (trustType) { 
      case kSecTrustResultInvalid: 
      case kSecTrustResultConfirm: 
      case kSecTrustResultDeny: 
      case kSecTrustResultUnspecified: 
      case kSecTrustResultFatalTrustFailure: 
      case kSecTrustResultOtherError: 
       break; 
      case kSecTrustResultRecoverableTrustFailure: 
       *publicKey = SecTrustCopyPublicKey(trust); 
       break; 
      case kSecTrustResultProceed: 
       *publicKey = SecTrustCopyPublicKey(trust); 
       break; 
     } 

    } 
} 

如果一切順利的話,你現在應該有公鑰的人口SecKeyRef。如果它不好,你將有一個NULL SecKeyRef和一個OSStatus指示出了什麼問題。安全框架中的SecBase.h提供了有關這些錯誤代碼的更多詳細信息。

現在您已經擁有帶公鑰的SecKeyRef,使用它來使用相應的私鑰對數據進行加密的情況很好地覆蓋了programming guide

請注意,您將不得不使用ARC或CFRelease發佈上面分配的內容(策略,證書)。

+0

是否可以做PKCS1?假設我得到由不同系統生成的密鑰對? – Turowicz