為什麼/如何 libsodium/nacl 的密碼箱可否認?
https://nacl.cr.yp.to/box.html參見“安全模型”。
據我所知,Alice 使用她的私鑰、Bob 的公鑰和一個 nonce 加密了一條消息。Bob 使用 Alice 的公鑰、他的私鑰和 nonce 解密消息。
文件說“crypto_box 函式並不意味著提供不可否認性。”
如果 Bob 可以使用她的公鑰驗證密文的來源和真實性,Alice 怎麼能說她沒有加密密文呢?
(假設消息必須採用已知語言或格式才能“真實”。)
採用 SEJPM 的答案並更明確:Bob 也可以生成該密文。
不可否認性的條件之一是沒有人(除了 Alice,假設她的私鑰沒有洩露)可以生成該消息。這在這裡不成立。如果 Bob 可以解密密文,他就知道 Alice 一定是生成了它(因為 Bob 知道他沒有),但是他不能向其他任何人證明它。
如果 Bob 可以使用她的公鑰解密密文,Alice 怎麼能說她沒有加密呢?
這是由於底層實現的工作方式。*
為此,每個私鑰都是一個整數 $ d_A $ 和 $ d_B $ 每個公鑰都是定義明確的“生成器”的倍數 $ G $ , 如下: $ P_A:=d_A\times G $ 和 $ P_B:=d_B\times G $ . 這實際上在Curve25519上執行,但這只是一個技術細節。
現在實現的功能也稱為“靜態diffie-hellman 密鑰交換”。這意味著愛麗絲 - 在誠實的執行中 - 計算 $ K:=d_A\times P_B $ ,其中一些確定性導數作為關鍵。將此密鑰與為XSalsa20 **- Poly1305數據加密提供的隨機數配對,您就可以了。
現在我們知道了細節,很容易意識到你無法證明誰創建了消息,畢竟兩者都會派生相同的靜態密鑰,而 Bob 可以很容易地偽造所有相關的元數據來最初聲明消息來自愛麗絲——儘管她從未見過。
- 或者更確切地說,伯恩斯坦想像它是如何工作的。實現可能會做不同的事情,但可能不會。
** XSalsa20 基本上只是具有更大隨機數的連結 Salsa20。