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;
}
公開鍵認証暗号化を使用すると、アリスはボブの公開鍵を使用して、ボブ専用の機密メッセージを暗号化できます。
ボブは、アリスの公開鍵を使用して、暗号化されたメッセージが実際にアリスによって作成され、改ざんされていないことを確認してから、最終的に復号化できます。
ボブが必要とするのは、アリスの公開鍵、ナンス、および暗号文だけです。
また、ボブにメッセージを送信するために、アリスはボブの公開鍵のみを必要とします。
元の例では、ボブはアリスからのメッセージを自分の秘密鍵で復号化し、アリスの公開鍵で検証します。私はコードを間違えましたが、メッセージはボブの秘密鍵なしで適切に復号化されました!
それはどのように可能ですか?私の間違いはどこですか?ありがとう