Dsa
在 ECIES 中籤名 + ETM
在文件加密協議中使用 ECIES,我需要對發送者進行身份驗證,所以我使用的是 ECDSA,我想知道是否簽署臨時公鑰(接收者需要用於派生共享對稱密鑰)是要走的路?目標是防止 MitM 偽造和發送假的臨時公鑰。程式碼(C#)使用 Inferno,但考慮到顯式變數名稱和註釋,很容易理解:
internal static void Encrypt(CngKey receiverPublicDhm, CngKey senderDsa, string file, string text) { var plainTextBytes = text.ToBytes(); var ephemeralBundle = receiverPublicDhm.GetSharedEphemeralDhmSecret(); var ephemeralPublic = ephemeralBundle.EphemeralDhmPublicKeyBlob; var sharedSymmetric = ephemeralBundle.SharedSecret; // sign emphemeral public blob and plainText(so that MitM cannot forge a fake ephemeral public key) var toSign = Utils.Combine(ephemeralPublic, plainTextBytes); byte[] signed; using (var ecdsa = new ECDsaCng(senderDsa) { HashAlgorithm = CngAlgorithm.Sha384 }) signed = ecdsa.SignData(toSign); // ETM signature and plaintext var toEncrypt = Utils.Combine(signed, plainTextBytes); var encrypted = SuiteB.Encrypt(sharedSymmetric, toEncrypt.AsArraySegment()); using (var fs = new FileStream(file, FileMode.Create, FileAccess.Write)) { // so the format is: // [ephemeral public] (signed but not encrypted) // [signature] [ciphertext] (both encrypted and MAC'd) fs.Write(ephemeralPublic, 0, ephemeralPublic.Length); fs.Write(encrypted, 0, encrypted.Length); } }
已編輯:修復了文件格式描述中的錯字
我不同意 Maarten Bodewes 對您的特定場景/程式碼的回答:
- 您的 ECDSA 簽名程式碼不會洩露有關明文的資訊。但是,即使這樣做了,簽名和明文也是 Inferno 加密的(即不受 MiTM 影響)。為了獲得 ECDSA 簽名,需要先解密(即,明文無論如何都會在解密時顯示)。
- 您的程式碼未簽署 ECDH 公鑰。它正在簽署雜湊
$$ ephemeral public key $$+$$ plaintext $$. 生成的簽名是 Inferno 加密的(對 MiTM 是安全的),並且對收件人篡改是安全的。
我相信您採用的方法沒有任何問題。我對您的文件格式/程式碼不發表任何評論。