14

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

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3gn+tJ1+PbP0GHa6hmM35WsVyibpypWAwRuBYY4MGfh3VWoXgiyiLo5HJTW1eR9BUFq3z+yOG1rwzSabZ8I4zneWm0kH7xErSjNrMbmjirbL7e6TQNa1ujP/x4x9XVbqf3vIsNVs19kn/qSX/HGzd5Ct3TGAo0AT0T4JwkCfciwIDAQAB

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

我需要做什么?

4

1 回答 1

12

首先,您必须 base64 将您的 NSString 解码为 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 释放您在上面分配的内容(策略、证书)。

于 2014-05-12T18:31:40.217 回答