0

私はこのトピックに慣れていないので、これがばかげた質問である場合は申し訳ありません:\

特定の公開鍵でメッセージを復号化しようとしています。メッセージと公開鍵の両方が Web サービスから提供されます。

現在復号化を行う方法については、次のコードを参照してください。

 for (NSValue *refVal in keyRefs) {
    SecKeyRef p_key = NULL;
    [refVal getValue:&p_key];
    if (p_key == NULL) continue;

    size_t dataLength = encryptedData.length;
    size_t outPutLength = MAX(dataLength, SecKeyGetBlockSize(p_key));

    void *outPutBuf = malloc(outPutLength);
    if (outPutBuf) {

        //  Error handling
        OSStatus status = SecKeyDecrypt(p_key,
                                        kSecPaddingNone,
                                        encryptedData.bytes,
                                        encryptedData.length,
                                        outPutBuf,
                                        &outPutLength
                                        );


        NSLog(@"decryption result code: %ld (size: %lu)", status, outPutLength);
        NSLog(@"FINAL decrypted text: %s", outPutBuf);

        if (status == errSecSuccess) {
            break;
        }
    } else {

        //Error handling
    }
}

エラーは発生しませんが、復号化された文字列は次のように表示されます (正しい出力は JSON 配列である必要があります)。

decryption result code: 0 size:511)  
FINAL decrypted text: ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ

「秘密鍵」ではなく「公開鍵」で「SecKeyDecrypt」を使用しているためですか?その場合、代わりに復号化に何を使用すればよいですか?

これに関して助けてくれてありがとう!

編集:私は次のコードを使用しています: http://blog.flirble.org/2011/01/05/rsa-public-key-openssl-ios/サーバーから取得した公開鍵を使用します(これは「コード スニペットの keyRefs" が由来)

4

1 に答える 1

2

もちろん、公開鍵は他の誰かがデータを暗号化するために使用するものであるため、秘密鍵を持っている人だけがデータを復号化できます。

公開鍵の定義そのものは、誰にでも与えることができるということです。他の誰かの暗号化されたメッセージを解読できるようにしたくないと思いませんか?

秘密鍵がどこに保存されているか、または keyRefs の内容 (またはクラス) が何であるかを、コード フラグメントから判断することは不可能です。

編集:上記のOPのコメントに応えて。そして明確化。

*「公開鍵自体は、サーバーに保存されている RSA キー ペアの公開部分です。暗号化されたメッセージは、最初にオブジェクトを JSON エンコードすることによってサーバー上で作成され、次に OPENSSL_PKCS1_PADDING を使用して秘密鍵で暗号化され、次に base64 で暗号化されます。 -エンコードされ、最終メッセージの一部として再度 JSON エンコードされます。メッセージと公開鍵はクライアントに保存されます。私が望むのは、公開鍵を使用してクライアントでメッセージを復号化することです。私が言ったように、imこのテーマはあまり得意ではないので、間違った方法でやろうとしたかもしれません"*

それは、公開鍵暗号化がどのように機能するかではありません。サーバーとクライアントは公開鍵を交換します。次に、それぞれが相手の公開鍵を使用して、相手に送信されるデータを暗号化します。受信者は、常に独自の秘密鍵を使用してメッセージを復号化します。

サーバーに暗号化された応答を生成させたい場合は、クライアントに要求で公開鍵を渡し、その公開鍵を使用して応答を暗号化し、クライアントの秘密鍵を使用してクライアントで応答を復号化します。

于 2012-06-19T16:25:44.717 に答える