4

libsodium による公開鍵暗号化をテストしたところ、奇妙な動作に遭遇しました。暗号化されたメッセージは、秘密鍵なしで復号化されます。

公式サイトlibsodium の例

#include "sodium.h"

#define MESSAGE         "test"
#define MESSAGE_LEN     4
#define CIPHERTEXT_LEN (crypto_box_MACBYTES + MESSAGE_LEN)

static bool TestSodium()
{
    unsigned char alice_publickey[crypto_box_PUBLICKEYBYTES];
    unsigned char alice_secretkey[crypto_box_SECRETKEYBYTES];
    crypto_box_keypair(alice_publickey, alice_secretkey);

    unsigned char bob_publickey[crypto_box_PUBLICKEYBYTES];
    unsigned char bob_secretkey[crypto_box_SECRETKEYBYTES];
    crypto_box_keypair(bob_publickey, bob_secretkey);

    unsigned char nonce[crypto_box_NONCEBYTES];
    unsigned char ciphertext[CIPHERTEXT_LEN];
    randombytes_buf(nonce, sizeof nonce);

    // message alice -> bob
    if (crypto_box_easy(ciphertext, (const unsigned char*)MESSAGE, MESSAGE_LEN, nonce, bob_publickey, alice_secretkey) != 0)
    {
        return false;
    }

    unsigned char decrypted[MESSAGE_LEN + 1];
    decrypted[MESSAGE_LEN] = 0;

    // Original!
    //if (crypto_box_open_easy(decrypted, ciphertext, CIPHERTEXT_LEN, nonce, alice_publickey, bob_secretkey) != 0)

    // Whis works without Bobs secret key!
    if (crypto_box_open_easy(decrypted, ciphertext, CIPHERTEXT_LEN, nonce, bob_publickey, alice_secretkey) != 0)
    {
        return false;
    }

    if(strcmp((const char*)decrypted, MESSAGE) != 0) return false;

    return true;
}

公開鍵認証暗号化を使用すると、アリスはボブの公開鍵を使用して、ボブ専用の機密メッセージを暗号化できます。

ボブは、アリスの公開鍵を使用して、暗号化されたメッセージが実際にアリスによって作成され、改ざんされていないことを確認してから、最終的に復号化できます。

ボブが必要とするのは、アリスの公開鍵、ナンス、および暗号文だけです。

また、ボブにメッセージを送信するために、アリスはボブの公開鍵のみを必要とします。

元の例では、ボブはアリスからのメッセージを自分の秘密鍵で復号化し、アリスの公開鍵で検証します。私はコードを間違えましたが、メッセージはボブの秘密鍵なしで適切に復号化されました!

それはどのように可能ですか?私の間違いはどこですか?ありがとう

4

1 に答える 1