C++ 加密盒easy和加密盒open easy的奇怪行为。不使用私钥解密?
我已经通过libnaude测试了公钥加密,并遇到了一个奇怪的行为。加密的消息在没有私钥的情况下被解密 来自官方网站的示例 通过使用公钥认证加密,Alice可以使用Bob的公钥专门为Bob加密机密消息 使用Alice的公钥,Bob可以验证加密的消息实际上是由Alice创建的,并且在最终解密之前没有被篡改 Bob只需要Alice的公钥、nonce和密文 为了向Bob发送消息,Alice只需要Bobs的公钥 在最初的示例中,Bob使用自己的密钥解密来自Alice的消息,并使用Alice的公钥验证消息。 我在代码中犯了一个错误,消息在没有Bob私钥的情况下被正确解密 这怎么可能?我的错在哪里?谢谢是的,这是可能的 在libnaude中,公钥认证加密分为三个不同的阶段,顺序如下: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的公钥验证消息。
- 这是最新的
- 以下是NM后的
步骤,它们是加密盒
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)