0

我正在尝试在我的 Mac OS X 应用程序中生成 RSA 密钥,我使用以下代码:

CFStringRef privateTag = (CFStringRef)@"com.example.privatekey";
CFStringRef publicTag = (CFStringRef)@"com.example.publickey";
int bits = 1024;
    CFMutableDictionaryRef publicAttr = CFDictionaryCreateMutable(kCFAllocatorDefault, 3, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
    CFDictionaryAddValue(publicAttr, kSecAttrIsPermanent, kCFBooleanTrue);
    CFDictionaryAddValue(publicAttr, kSecAttrApplicationTag, publicTag);

    CFMutableDictionaryRef privateAttr = CFDictionaryCreateMutable(kCFAllocatorDefault, 3, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
    CFDictionaryAddValue(privateAttr, kSecAttrIsPermanent, kCFBooleanTrue);
    CFDictionaryAddValue(privateAttr, kSecAttrApplicationTag, publicTag);

    CFMutableDictionaryRef keyPairAttr = CFDictionaryCreateMutable(kCFAllocatorDefault, 3, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
    CFDictionaryAddValue(keyPairAttr, kSecAttrKeyType, kSecAttrKeyTypeRSA);
    CFDictionaryAddValue(keyPairAttr, kSecAttrKeySizeInBits, CFNumberCreate( kCFAllocatorDefault, kCFNumberIntType, &bits));
    CFDictionaryAddValue(keyPairAttr, kSecPublicKeyAttrs, privateAttr);
    CFDictionaryAddValue(keyPairAttr, kSecPrivateKeyAttrs, publicAttr);

    status = SecKeyGeneratePair((CFDictionaryRef)keyPairAttr, &publicKey, &privateKey);

    if (status != noErr) {
        NSLog(@"something went wrong %d", (int)status);
    }else {
        NSLog(@"New key");
    }

如果我尝试构建 kSecPublicKeyAttrs 是一个未声明的标识符,我不知道为什么。有人可以帮忙吗?

问候,菲利普

4

1 回答 1

2

首先,您在 OS X 上使用 iOS 示例代码。框架相似,但不完全相同。但是没有 OS X 示例代码,并且 iOS 示例代码显示在 OS X 文档集中,所以我不确定您是否应该为此受到指责……</p>

同时,虽然 iOS 框架具有公共常量 kSecPublicKeyAttrs 和 kSecPrivateKeyAttrs,但如果您查看源代码 (http://www.opensource.apple.com/source/libsecurity_keychain/libsecurity_keychain-55050.2/),OS X 版本将这些常量设为私有常量,隐藏在框架中:

/* Constants used by SecKeyGeneratePair() - in SecKey.h.  Never used in
any SecItem apis directly. */
SEC_CONST_DECL (kSecPrivateKeyAttrs, "private");
SEC_CONST_DECL (kSecPublicKeyAttrs, "public");

所以,显然你可以传递@"private" 和@"public" (或者为它们创建你自己的常量)并且......好吧,我不能保证它会起作用,但你至少应该尝试一下。

同时,SecKeyGeneratePair 的文档说:

此外,您可以分别为公钥和私钥指定多个属性。您可以通过将键值对直接添加到字典中,或者通过添加键 kSecPrivateKeyAttrs 和 kSecPublicKeyAttrs 中的一个或两个来实现。

所以要么文档错误,要么框架错误;我建议向 Apple 提交错误,无论 @"private" 和 @"public" 是否适合您。我建议在 Apple devforums 上发布相关信息,Apple 员工可能会注意到并为您提供准官方的解决方法。

于 2012-05-24T21:03:28.497 回答