Encryption

為什麼不推薦使用 ed25519 密鑰進行加密?

  • February 20, 2022

想知道為什麼沒有直接使用 ed25519 密鑰進行加密的方法。

然後我發現了這個:https ://github.com/indutny/elliptic/issues/108

據說它與 RSA 不同,不推薦用於此目的 - 人們應該從 diffie-hellman 風格的共享密鑰中派生對稱密鑰。

它更用於簽名。但如果簽名是這樣工作的:

hash = doHash(message)
signature = doAsymmetricEncrypt(hash, privateKey)

hash == doAsymmetricDecrypt(signature, publicKey) // true

我認為它也應該朝這個方向工作。

encryptedToken = doAsymmetricEncrypt(token, publicKey)

token = doAsymmetricDecrypt(encryptedToken, privateKey)

我目前對相關事項的理解歸結為:

  • 非對稱加密在兩個方向上都起作用:用私鑰加密 -> 用公鑰解密 & 用公鑰加密 -> 用私鑰解密
  • ed25519 私鑰只是一個隨機的 256 位數字
  • 可以通過將私鑰編號投影到曲線上來明確導出公鑰25519
  • ed25519 實際上表示 DSA 與 SHA-512 結合的版本

所以我會假設當我有 32 個字節的私鑰並且知道它正是這樣的密鑰時。無論將其用作簽名或加密算法,我都應該能夠在任何情況下使用它。

你似乎對一些事情感到困惑。忍受我,這是一個很常見的困惑!

加密定義是為了保密地傳輸資訊:如果您加密資訊,則意味著在接收方*解密之前將其隱藏。*請注意,在您的虛擬碼中

hash = doHash(message)
signature = doAsymetricEncrypt(hash, privateKey)

hash == doAsymetricDecrypt(signature, publicKey) //true

…不可能message從您的“密文”signature中檢索:您只能檢索雜湊。其次,您使用私鑰進行加密,而使用公鑰進行解密,這意味著任何一方都可以解密您的hash,因為您publicKey顯然是公開的。

數字簽名是用於驗證數字消息或文件(維基百科)真實性的數學方案。請注意,這從未在加密方面進行定義。讓我強調一點:如果您有一位老師聲稱“簽名是使用私鑰進行的加密”,那他們就錯了。如果你有一本書聲稱這一點,把它扔掉,燒掉——不要把它扔掉,因為它顯然會引起混亂——然后買一本更好的書。加密是為了保密,簽名是為了真實性。

也就是說:這種混亂的根源在於 RSA 的數學。在 RSA(而不是 ECC!)中,教科書籤名的運算符與加密的運算符相同,只是交換了密鑰材料。請注意,數學運算是同一件事,而不是簽名“是通過交換密鑰進行加密的”,儘管它們看起來確實如此。另請注意,這適用於教科書 RSA,它從未按原樣部署,但需要在簽名和加密之間進行不同的填充和隨機化。

因此,雖然您的虛擬碼可能適用於 RSA,也可能不適用於RSA(取決於您使用的庫),但它根本不安全,並且根本無法適用於 ECC,因為密鑰材料無法交換,因為背後的數學它根本不支持它。


現在,最後回答您的問題,橢圓曲線加密存在,被廣泛使用,稱為ECIES。它確實歸結為 Diffie-Hellman 交換,然後使用對稱算法。如果您有非常短的消息,還有ElGamal 加密。

但是,同時為 ECIES 和 EdDSA 簽名重用相同的密鑰是否安全是另一個問題。

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