我使用SecKeyGeneratePair
创建了一对密钥。我现在想将公钥传递给服务器,但我不确定如何继续。
我有一个函数getPublicKeyBits
(取自Apple的CryptoExercise
),但我真的不知道如何处理原始NSData。这是功能:
- (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
或加密库可以理解的其他格式?我应该base64编码吗?还有其他我需要做的事情吗?
如果有帮助,我正在尝试使用可用于Python的M2Crypto
库的公钥。
答案 0 :(得分:2)
我想你会想看看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);
答案 1 :(得分:1)
此页面提供了一些很棒的提示和示例代码,用于将您拥有的数据打包成PEM格式,以便将其发送到服务器:
http://blog.wingsofhermes.org/?p=42
您不需要从源编译并静态链接的整个openssl库来执行此操作。我正在使用这种技术,将基本64键包装在“----- BEGIN PUBLIC KEY -----”中,并且Rails应用程序可以使用标准的ruby openssl类来读取和使用它。