簡體   English   中英

從base64編碼的字符串中獲取SecKeyRef

[英]get SecKeyRef from base64 coded string

我正在開發一個iOS應用程序,我得到一個base64編碼的公鑰,例如:

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

我想用這個公鑰編碼一些文本,但我找不到將這個字符串轉換為有用的公鑰的方法。

我需要做什么?

首先,您必須將NSString的base64解碼為NSData:請參閱此答案以獲取解決方案。 如果您正在為iOS 7開發,則可以使用initWithBase64EncodedString::options

將字符串解碼為NSData后,您可以嘗試從中創建證書。 您收到的證書格式很重要 - 您可以使用DER(通用)或PKCS12。 你可能會把它作為DER,所以我認為你需要指導。

創建證書和策略:

SecCertificateRef   cert    = NULL;
SecPolicyRef        policy  = NULL;

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

如果傳遞給SecCertificateCreateWithData時證書數據格式不正確,您將獲得NULL結果。

此時您擁有證書,但不是公鑰。 要獲取公鑰,您必須創建信任引用並評估證書的信任

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, 編程指南很好地使用它來用相應的私鑰加密數據。

請注意,您必須使用ARC或CFRelease釋放您在上面分配的內容(策略,證書)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM