為什麼不推薦使用 ed25519 密鑰進行加密?
想知道為什麼沒有直接使用 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 簽名重用相同的密鑰是否安全是另一個問題。