Цель 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 возвращает ошибку о том, что ключ не найден.