Objective C Secure.h RSA密钥对生成

时间:2012-10-09 12:31:52

标签: xcode macos security rsa key-pair

我尝试在this topic上提出一个关于如何生成rsa-keys的示例代码的后续问题,这些代码对我来说不起作用,但是由于某些原因它被主持人删除了。因此,我将尝试发布一个新问题。

我的答案是,Xcode告诉我没有声明“kSecPrivateKeyAttrs”和“kSecPublicKeyAttrs”标识符。 Apple开发人员文档中提到了这些标识符,但它们似乎并不存在于Secure框架中。

我正在使用Xcode 4.5和OS X SDK 10.8。

感谢我能得到的任何帮助,我对OC编程很新。 如果我让这个工作,我也想知道如何获得pubkey和privkey作为NSString或NSData。

谢谢

编辑:我仍然遇到这方面的问题,肯定还有其他人在那里遇到了同样的问题并修复了它并指出了我的正确方向吗?

EDIT2正如我所说,我正在尝试从我发布的链接中获取代码,但这里仍然是完整的代码:

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 个答案:

答案 0 :(得分:0)

之后你可以找回钥匙吗? 我无法取回钥匙。就像他们不在钥匙链中一样。 调用SecItemCopyMatching会返回错误,指出未找到密钥。

答案 1 :(得分:0)

有点晚了,但是由于我目前正在处理一个相关问题,所以我觉得我有所了解。

对于iOS,您可以为私钥和公钥指定单个词典,它们的属性可以不同。但是对于Mac,您可以将所有属性直接放在一个字典中,并将它们应用于两个键。