我已经通过 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;
}
使用公钥认证加密,Alice 可以使用 Bob 的公钥加密专门为 Bob 发送的机密消息。
使用 Alice 的公钥,Bob 可以在最终解密之前验证加密消息实际上是由 Alice 创建的并且没有被篡改。
Bob 只需要 Alice 的公钥、nonce 和密文。
为了向 Bob 发送消息,Alice 只需要 Bobs 的公钥。
在原始示例中,Bob 使用自己的密钥解密来自 Alice 的消息,并使用 Alice 的公钥对其进行验证。我在代码中犯了一个错误,并且在没有 Bob 的私钥的情况下正确解密了消息!
怎么可能?我的错误在哪里?谢谢