16

公開鍵と秘密鍵の 2 つの鍵があり、どちらも SecKeyRef 変数に格納されています。簡単にするために、公開のものから始めましょう。私がやりたいのは、それを NSData オブジェクトにエクスポートすることです。そのために、Apple が提供するほとんど有名なコード スニペットがここにあります。

- (NSData *)getPublicKeyBits {
    OSStatus sanityCheck = noErr;
    NSData * publicKeyBits = nil;

    NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init];

    // Set the public key query dictionary.
    [queryPublicKey setObject:(id)kSecClassKey forKey:(id)kSecClass];
    [queryPublicKey setObject:publicTag forKey:(id)kSecAttrApplicationTag];
    [queryPublicKey setObject:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];
    [queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnData];

    // Get the key bits.
    sanityCheck = SecItemCopyMatching((CFDictionaryRef)queryPublicKey, (CFTypeRef *)&publicKeyBits);

    if (sanityCheck != noErr)
    {
        publicKeyBits = nil;
    }

    [queryPublicKey release];

    return publicKeyBits;
}

ただし、Xcode 4.6.2 を使用していますが、コードに誤りがあるように見えます (id への各変換の前に「__bridge」が追加されます)。新しいバージョンは次のようになります。

- (NSData *)getPublicKeyBitsFromKey:(SecKeyRef)givenKey {
    OSStatus sanityCheck = noErr;
    NSData * publicKeyBits = nil;

    NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init];

    // Set the public key query dictionary.
    [queryPublicKey setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass];
    [queryPublicKey setObject:publicTag forKey:(__bridge id)kSecAttrApplicationTag];
    [queryPublicKey setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
    [queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnData];

    // Get the key bits.
    sanityCheck = SecItemCopyMatching((__bridge CFDictionaryRef)queryPublicKey, (CFTypeRef *)&publicKeyBits);

    if (sanityCheck != noErr)
    {
        publicKeyBits = nil;
    }

    return publicKeyBits;
}

ただし、まだ 2 つのエラーがあります。

  • 宣言されていない識別子「publicTag」の使用
  • ARC では、「CFTypeRef 」(別名「const void *」)への Objective-C ポインターへの間接ポインターのキャストは許可されていません。

さて、あなたの助けの後、最初の問題がもはや問題にならないことを願っています。クエリを作成したり、キーチェーンからキーを抽出したくないからです。私はそれを変数に入れており、そこから抽出したいと考えています。変数の名前はgivenPublicKeyで、これが NSData に変換したいキーです。

では、これを実行してこの ARC の問題を解決するにはどうすればよいでしょうか。

フォローアップ:秘密鍵を NSDataにエクスポートするにはどうすればよいですか。使用しようとしている関数が公開鍵に対してのみ機能することを何度か読んだことがあります。

4

1 に答える 1