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/)を見ると、OSXバージョンにはこれらがプライベートとしてありますフレームワークに隠された定数:

/* 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のいずれかまたは両方を追加します。

したがって、ドキュメントが間違っているか、フレームワークが間違っています。@"private"と@"public"が機能するかどうかに関係なく、Appleにバグを報告することをお勧めします。そして、これについてApple devforumsに投稿することをお勧めします。そこでは、Appleの従業員が気づき、準公式の回避策を提供する可能性があります。

于 2012-05-24T21:03:28.497 に答える