Цель C Secure.h Генерация пары ключей RSA

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

Моя проблема с этим ответом заключается в том, что Xcode сообщает мне, что идентификаторы "kSecPrivateKeyAttrs" и "kSecPublicKeyAttrs" не объявлены. Эти идентификаторы упоминаются в документах Apple для разработчиков, но, похоже, их нет в Secure Framework.

Я использую Xcode 4.5 и OS X SDK 10.8.

Я ценю любую помощь, которую я могу получить, я довольно новичок в OC-программировании. Если я получу это на работу, я также хотел бы знать, как получить pubkey и privkey как NSString или NSData.

Спасибо

РЕДАКТИРОВАТЬ: У меня все еще есть проблемы с этим, конечно, есть кто-то еще с той же проблемой, которая исправила и может указать мне в правильном направлении?

РЕДАКТИРОВАТЬ2 Как я уже говорил, я пробовал код по ссылке, которую я разместил, но в любом случае вот полный код:

Keypair.h

#import <Security/Security.h>

@interface Keypair
{
    SecKeyRef publicKey;
    SecKeyRef privateKey;
    NSData *publicTag;
    NSData *privateTag;
 }
 - (void)generateKeyPair:(NSUInteger)keySize;
 @end

Keypair.m

#import "Keypair.h"

@implementation Keypair

static const UInt8 publicKeyIdentifier[] = "com.XXXXXXX.publickey\0";
static const UInt8 privateKeyIdentifier[] = "com.XXXXXXX.privatekey\0";

+ (void)generateKeyPair:(NSUInteger)keySize {
    OSStatus sanityCheck = noErr;
    SecKeyRef publicKey = NULL;
    SecKeyRef privateKey = NULL;
    NSData *publicTag;
    NSData *privateTag;

    // Container dictionaries.
    NSMutableDictionary * privateKeyAttr = [[NSMutableDictionary alloc] init];
    NSMutableDictionary * publicKeyAttr = [[NSMutableDictionary alloc] init];
    NSMutableDictionary * keyPairAttr = [[NSMutableDictionary alloc] init];

    // Set top level dictionary for the keypair.
    [keyPairAttr setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
    [keyPairAttr setObject:[NSNumber numberWithUnsignedInteger:keySize] forKey:(__bridge id)kSecAttrKeySizeInBits];
    [keyPairAttr setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecAttrIsPermanent];

    // Set the private key dictionary.
    [privateKeyAttr setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecAttrIsPermanent];
    [privateKeyAttr setObject:privateTag forKey:(__bridge id)kSecAttrApplicationTag];
    // See SecKey.h to set other flag values.

    // Set the public key dictionary.
    [publicKeyAttr setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecAttrIsPermanent];
    [publicKeyAttr setObject:publicTag forKey:(__bridge id)kSecAttrApplicationTag];
    // See SecKey.h to set other flag values.

    // Set attributes to top level dictionary.
    [keyPairAttr setObject:privateKeyAttr forKey:(id)kSecPrivateKeyAttrs];
    [keyPairAttr setObject:publicKeyAttr forKey:(id)kSecPublicKeyAttrs];


    // SecKeyGeneratePair returns the SecKeyRefs just for educational purposes.
    sanityCheck = SecKeyGeneratePair((__bridge CFDictionaryRef)keyPairAttr, &publicKey, &privateKey);
    if(sanityCheck == noErr  && publicKey != NULL && privateKey != NULL)
    {
        NSLog(@"Successful");
    }
}

@end

2 ответа

Немного поздно, но так как я сейчас занимаюсь связанной с этим проблемой, я решил пролить немного света.

Для iOS вы указываете отдельные словари для закрытого и открытого ключа, их атрибуты могут быть разными. Но для Mac вы помещаете все атрибуты непосредственно в один словарь, и они применяются к обоим ключам.

Не могли бы вы получить ключи после этого? Я не могу вернуть ключи. Как будто их нет в цепочке для ключей. Вызов SecItemCopyMatching возвращает ошибку о том, что ключ не найден.

Другие вопросы по тегам