从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释放上面分配的内容(策略,证书)。