从base64编码的字符串中获取SecKeyRef

时间:2012-09-07 14:12:57

标签: ios security rsa

我正在开发iOS应用程序并获得base64编码的公钥,例如:

  

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

我想使用此公钥对某些文本进行编码,但我找不到将此字符串转换为有用公钥的方法。

我需要做什么?

1 个答案:

答案 0 :(得分:11)

首先,您必须将NSString的base64解码为NSData: 有关解决方案,请参阅this answer。如果您正在为iOS 7开发,可以使用initWithBase64EncodedString::options

将字符串解码为NSData后,您可以尝试从中创建证书。您收到的证书格式很重要 - 您可以使用DER(通用)或PKCS12。你可能会把它作为DER,所以我认为你需要指导。

创建证书和政策:

SecCertificateRef   cert    = NULL;
SecPolicyRef        policy  = NULL;

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

如果传递给SecCertificateCreateWithData时证书数据的格式不正确,您将获得NULL结果。

此时您拥有证书,但不是公钥。要获取公钥,您必须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释放您在上面分配的内容(策略,证书)。