首先,你必須的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發佈上面分配的內容(策略,證書)。
您可能必須['SecItemAdd',然後是'SecItemCopyMatching'](https://developer.apple.com/library/ios/#documentation/security/conceptual/keychainServConcepts/iPhoneTasks/iPhoneTasks.html)來執行此操作。 – bobobobo
[另見](http://blog.flirble.org/2011/01/05/rsa-public-key-openssl-ios/) – bobobobo
你有沒有得到你的問題的答案? – Devarshi