Подтвердить что ты не робот

Сохранение устройства SecKeyRef создало пару открытых/закрытых ключей на диске

Я создал пару симметричных ключей RSA на устройстве с использованием SecKeyGeneratePair() на устройстве. У меня есть SecKeyRef указатели на структуру для каждого ключа. Итак, как мне сохранить SecKeyRef на диск? Или даже передать его (я также думаю, что есть проблемы с правильным кодированием тоже)? Заметки руководства по сертификату Apple, Key и Trust Services

Вы можете отправить свой открытый ключ кому угодно, кто сможет его использовать для шифрования данных.

Я хотел бы особо сохранить секретный ключ; поэтому я могу использовать его на развернутых устройствах для дешифрования данных, зашифрованных открытым ключом.

P.S. Я не возражаю, если результирующие данные для каждого ключа являются DER-кодированными ASN.1 или base-64; Мне просто нужно выяснить, как вытащить ключ из SecKeyRef. Я также хорошо осведомлен о существовании OS X SecKeychainItemExport().

4b9b3361

Ответ 1

А, сам нашел ответ; вы можете получить байты для открытого ключа, используя SecItemCopyMatching().
- (NSData *)getPublicKeyBits {
    OSStatus sanityCheck = noErr;
    NSData * publicKeyBits = nil;

    NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init];

    // Set the public key query dictionary.
    [queryPublicKey setObject:(id)kSecClassKey forKey:(id)kSecClass];
    [queryPublicKey setObject:publicTag forKey:(id)kSecAttrApplicationTag];
    [queryPublicKey setObject:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];
    [queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnData];

    // Get the key bits.
    sanityCheck = SecItemCopyMatching((CFDictionaryRef)queryPublicKey, (CFTypeRef *)&publicKeyBits);

    if (sanityCheck != noErr)
    {
        publicKeyBits = nil;
    }

    [queryPublicKey release];

    return publicKeyBits;
}

Вышеупомянутое из Apple CryptoExercise. Не уверен, что он работает для закрытых ключей.

Ответ 2

См. раздел Шифрование и дешифрование данных в Руководстве по программированию сертификатов, ключей и доверительных служб, которое содержит образцы кода для генерации, и использовать пары открытого/закрытого ключей.

Ответ 3

Вы можете использовать последний крипто-API iOS, вы можете сохранить ключ как NSData и получить ключ из NSData

SecKeyRef key = <# a key #>;
CFErrorRef error = NULL;
NSData* keyData = (NSData*)CFBridgingRelease(  // ARC takes ownership
                       SecKeyCopyExternalRepresentation(key, &error)
                   );
if (!keyData) {
    NSError *err = CFBridgingRelease(error);  // ARC takes ownership
    // Handle the error. . .
}

https://developer.apple.com/documentation/security/certificate_key_and_trust_services/keys/storing_keys_as_data?language=objc