9

公開鍵に問題があるので、SecKeyGeneratePair を使用して公開鍵と秘密鍵を生成しました。ここで、公開鍵をサーバーに送信する必要があります。以下の方法を使用して SecKeyRef を NSData に変換しましたが、常に同じ公開鍵を取得しています。ただし、それをbase64形式に変換してサーバーに送信しました。しかし、まったく機能せず、サーバー(Java)がエラーをスローし始めます。これが私のiOSコードです:

- (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;
}

SecKeyRef を NSString または NSData に変換するのを手伝ってくれる人はいますか。

前もって感謝します!!!

-ムラリ・クリシュナン

4

1 に答える 1

9

iOS によって生成されたキーには、他の世界 (あなたの場合は Java API) が期待するいくつかのヘッダー情報が欠けていると思います。したがって、Java が iOS セキュリティ API によって生成されたキーを処理するには、まずこのヘッダー情報をバイナリ キー に追加する必要があります。

逆に、iOS Sec* API が (たとえば) openssl または ssh-keygen によって生成されたキーを使用できるようにするには、まずバイナリ キーからこのヘッダー情報を削除する必要があります。

具体的に言うと、iOS は ASN.1 OID を好まず、世界の他の地域も好んでいます。

Java アプリで使用するために iOS で生成されたキーをエクスポートする方法については、この記事を参照してください。

http://blog.wingsofhermes.org/?p=42

于 2012-06-15T19:30:24.113 に答える