iPhone:如何将SecKeyRef或包含公钥的位的NSData导出为PEM格式?

我使用SecKeyGeneratePair创build了一对密钥。 我现在想把公钥传给服务器,但是我不确定如何继续。

我有一个函数getPublicKeyBits (取自苹果的CryptoExercise ),但我真的不知道如何处理原始的NSData。 这是function:

 - (NSData *)getPublicKeyBits { OSStatus sanityCheck = noErr; NSData* publicKeyBits = nil; NSData* publicTag = [[NSData alloc] initWithBytes:publicKeyIdentifier length:sizeof(publicKeyIdentifier)]; CFDataRef cfresult = NULL; NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init]; // Set the public key query dictionary. [queryPublicKey setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass]; [queryPublicKey setObject:publicTag forKey:(__bridge id)kSecAttrApplicationTag]; [queryPublicKey setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType]; [queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnData]; // Get the key bits. sanityCheck = SecItemCopyMatching((__bridge CFDictionaryRef)queryPublicKey, (CFTypeRef*)&cfresult); if (sanityCheck != noErr) { publicKeyBits = nil; } else { publicKeyBits = (__bridge_transfer NSData *)cfresult; } return publicKeyBits; } 

如何将这些原始字节数据转换成像PEM或encryption库可以理解的其他格式? 我应该base64编码吗? 我还需要做其他事情吗?

如果有帮助,我试图使用Python的公钥和M2Crypto库。

我想你会想看看http://www.openssl.org/docs/crypto/pem.html#也许:

 int PEM_write_PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, unsigned char *kstr, int klen, pem_password_cb *cb, void *u); 

这个页面有一些很棒的提示和示例代码,用于打包PEM格式的数据,以便将其发送到服务器:

http://blog.wingsofhermes.org/?p=42

你不需要从源代码编译的整个openssl库和静态链接来做到这一点。 我正在使用这种技术,将基本的64位密钥包装在“—– BEGIN PUBLIC KEY —–”中,它可以被Rails应用程序使用标准的ruby openssl类读取和使用。