从base64编码的string获取SecKeyRef

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

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

我想用这个公钥编码一些文本,但我找不到一种方法来将此string转换为有用的公钥。

我需要做什么?

首先,你必须base64解码你的NSString到NSData:看到这个答案的解决scheme。 如果您正在开发iOS 7,则可以使用initWithBase64EncodedString::options

一旦你的string解码为NSData,你可以尝试从它创build一个证书。 您收到的证书的格式很重要 – 您可以使用DER(这是常用的)或PKCS12。 你很可能会得到DER,所以这就是我认为你需要指导。

创build一个证书和策略:

 SecCertificateRef cert = NULL; SecPolicyRef policy = NULL; cert = SecCertificateCreateWithData(kCFAllocatorDefault, data); policy = SecPolicyCreateBasicX509(); 

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

此时你有证书,但没有公钥。 要获取公钥,您必须创build一个信任引用并评估证书的信任度。

 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,使用它来使用相应的私钥encryption数据已经被编程指南所覆盖。

请注意,您将不得不使用ARC或CFRelease释放上面分配的内容(策略,证书)。