Dsa

在 ECIES 中籤名 + ETM

  • December 29, 2016

在文件加密協議中使用 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 對您的特定場景/程式碼的回答:

  1. 您的 ECDSA 簽名程式碼不會洩露有關明文的資訊。但是,即使這樣做了,簽名明文也是 Inferno 加密的(即不受 MiTM 影響)。為了獲得 ECDSA 簽名,需要先解密(即,明文無論如何都會在解密時顯示)。
  2. 您的程式碼未簽署 ECDH 公鑰。它正在簽署雜湊

$$ ephemeral public key $$+$$ plaintext $$. 生成的簽名是 Inferno 加密的(對 MiTM 是安全的),並且對收件人篡改是安全的。

我相信您採用的方法沒有任何問題。我對您的文件格式/程式碼不發表任何評論。

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