iPhone: Как экспортировать SecKeyRef или NSData, содержащие биты открытого ключа, в формат PEM?
Я создал пару ключей, используя 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 кодировать его? Есть ли что-то еще, что мне нужно сделать?
Если это поможет, я пытаюсь использовать открытый ключ с M2Crypto
библиотека доступна для Python.
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);
На этой странице есть несколько полезных советов и примеров кода для упаковки имеющихся у вас данных в формат PEM, чтобы вы могли отправить их на сервер:
http://blog.wingsofhermes.org/?p=42
Вам не нужна вся библиотека openssl, скомпилированная из исходного кода и статически связанная для этого. Я использую только эту технику, оборачивая ключ base 64 в "-----BEGIN PUBLIC KEY-----", и он может быть прочитан и использован приложением Rails с использованием стандартных ruby-классов openssl.