C++ 加密盒easy和加密盒open easy的奇怪行为。不使用私钥解密?

C++ 加密盒easy和加密盒open easy的奇怪行为。不使用私钥解密?,c++,cryptography,public-key-encryption,libsodium,C++,Cryptography,Public Key Encryption,Libsodium,我已经通过libnaude测试了公钥加密,并遇到了一个奇怪的行为。加密的消息在没有私钥的情况下被解密 来自官方网站的示例 通过使用公钥认证加密,Alice可以使用Bob的公钥专门为Bob加密机密消息 使用Alice的公钥,Bob可以验证加密的消息实际上是由Alice创建的,并且在最终解密之前没有被篡改 Bob只需要Alice的公钥、nonce和密文 为了向Bob发送消息,Alice只需要Bobs的公钥 在最初的示例中,Bob使用自己的密钥解密来自Alice的消息,并使用Alice的公钥验证消息。

我已经通过libnaude测试了公钥加密,并遇到了一个奇怪的行为。加密的消息在没有私钥的情况下被解密

来自官方网站的示例

通过使用公钥认证加密,Alice可以使用Bob的公钥专门为Bob加密机密消息

使用Alice的公钥,Bob可以验证加密的消息实际上是由Alice创建的,并且在最终解密之前没有被篡改

Bob只需要Alice的公钥、nonce和密文

为了向Bob发送消息,Alice只需要Bobs的公钥

在最初的示例中,Bob使用自己的密钥解密来自Alice的消息,并使用Alice的公钥验证消息。 我在代码中犯了一个错误,消息在没有Bob私钥的情况下被正确解密

这怎么可能?我的错在哪里?谢谢

是的,这是可能的 在libnaude中,公钥认证加密分为三个不同的阶段,顺序如下:

  • 密钥交换-使用算法(X25519)从我的私钥和你的公钥生成共享密钥

    • 这是最新的
  • 加密-使用步骤1中生成的共享密钥对明文消息应用对称密钥加密(XSalsa20)

  • 身份验证-生成MAC(Poly1305),同样依赖于在上述步骤中生成的密钥

    • 以下是NM后的
      加密盒
      步骤,它们是
  • 在步骤2-3中使用对称加密意味着Alice和Bob必须可以计算相同的密钥,即

    shared_key_computed_by_alice = crypto_box_beforenm(bob_pk, slice_sk)
    shared_key_computed_by_bob = crypto_box_beforenm(alice_pk, bob_sk) 
    assert(shared_key_computed_by_alice == shared_key_computed_by_bob)
    
    因为我们需要两个密钥对来生成相同的共享密钥,所以不难看出这两个密钥对也可以解密相同的消息

    这很好 请注意,在“错误”解密的实现中,不仅使用了Bob的公钥,还使用了Alice的私钥(只有Alice知道)

    因为是Alice想要将加密消息发送给Bob,这意味着Alice首先应该知道明文消息。因此,她可以使用自己的私钥解密该消息,这不是一个安全问题

    如果将Bob的公钥与另一个人(Eve)的私钥一起使用,解密例程将真正失败


    如果你认为Alice能够解密她自己的消息是个问题,你可以在对话结束后强迫Alice销毁她的私钥。非常感谢你的回答。这种行为并不明显。在文档中:“pk是加密邮件的发件人的公钥。sk是愿意验证和解密它的接收方的密钥。如果验证失败,函数返回-1,如果验证成功,函数返回0。成功后,解密后的消息将存储到m'中。安全问题是,如果Alice的私钥被盗,攻击者可以解密Bob的所有消息。谢谢你的提醒box@Lexeich请注意,密封盒无法验证发件人的身份。封箱后,您可以使用真正的私钥应用签名,但不要引用我的话,最好与安全专家联系。@Lexeich:这个问题与您的公式有点不同。在“传统”的非对称加密技术中,获取Alice的密钥会破坏发送给Alice的所有消息(包括Bob发送的消息)。使用上面描述的
    libnail
    方法,所有发送给Alice和Alice发送的消息都会被破坏。在这两种情况下,鲍勃与其他通讯员的通信中传递的信息都是保密的。
    shared_key_computed_by_alice = crypto_box_beforenm(bob_pk, slice_sk)
    shared_key_computed_by_bob = crypto_box_beforenm(alice_pk, bob_sk) 
    assert(shared_key_computed_by_alice == shared_key_computed_by_bob)