Public-Key

與 NaCl 共享密鑰加密的一種方法 - 為加密方生成一次性密鑰對是否安全

  • July 2, 2021

因此,我需要使用者能夠向我傳遞其他人無法讀取的資訊,因此我生成了一個密鑰。使用 NaCl,我從該密鑰創建一個密鑰對,並與我的使用者共享該密鑰對的公鑰。

現在,他們加密他們的資訊nacl.box()需要他們的消息,一個隨機數,我的公鑰,還有他們的私鑰?在過去,我傳統上使用非對稱加密,如AES(編輯:我的意思是 RSA)並且只需要我的公鑰……所以我只是在使用者端生成一個隨機密鑰對供使用者使用。我會打電話給這個throwawayKey

encryptedMessage = nacl.box(message = "foo", 
                           nonce = 0, 
                           publicKey = MY_SHARED_KEY, 
                           secretKey = throwawayKey.secretKey());

然後他們可以將這條加密消息發回給我,並將我生成的一次性密鑰的公鑰發回給我:throwawayKey.publicKey()

然後,我可以稍後使用以下方法解密:

decryptedMessage = nacl.box.open(message = encryptedMessage, 
                                nonce = 0, 
                                publicKey = throwawayKey.publicKey(), 
                                secretKey = MY_SECRET_KEY);

這是讓使用者安全地將他們的資訊發送給我的安全方式嗎?

我不習慣為通用單向非對稱加密生成一次性密鑰對。只生成一個隨機的一次性密鑰感覺不對。我用錯了NACL嗎?

文件中

crypto_box函式使用發送者的密鑰、接收者的公鑰和隨機數對消息進行加密和驗證m skpk``n

因此,密鑰(實際上是私鑰,但具有相同的首字母縮寫詞)用於身份驗證。如果您使用臨時(您稱之為“一次性”)密鑰對,那麼您將放棄對身份驗證的驗證。對於身份驗證,您需要信任發送者的公鑰——畢竟攻擊者也可以生成密鑰對。

好消息是經過身份驗證的加密至少應該防止明文預言機攻擊。這類攻擊可能會導致部分或全部明文洩露而不會洩露密鑰。

如果您希望使用者能夠匿名向您發送消息,您可以使用“密封框”而不是普通框。

引用自:https://crypto.stackexchange.com/questions/87939