Symmetric

從密碼片語到對稱密鑰的 GnuPG 過程是什麼?

  • February 14, 2019

假設我使用 GnuPG 對文件進行對稱加密,如下所示:

gpg --no-options -c --cipher-algo AES256 --no-random-seed-file -o my.out my.file

然後,我會在提示時提供密碼。

  • 軟體實際上採取了哪些步驟來從我作為使用者提供的密碼片語到用於保護數據的實際 256 位 AES 密鑰?
  • 與密碼片語相關或派生的哪些數據儲存在輸出密文文件中?
  • 以上哪些是標准保證的,哪些是實現定義的?

GPG 實現了 OpenPGP 標準RFC 4880,因此它實現了String-to-Key Specifiers

3.7. 字元串到鍵 (S2K) 說明符

字元串到密鑰 (S2K) 說明符用於將密碼字元串轉換為對稱密鑰加密/解密密鑰。它們目前用於兩個地方:加密私鑰環中私鑰的秘密部分,以及將密碼片語轉換為對稱加密消息的加密密鑰。

3.7.1. 字元串到鍵 (S2K) 說明符類型

目前支持三種類型的 S2K 說明符,以及

一些保留值:

   ID          S2K Type
   --          --------
   0           Simple S2K
   1           Salted S2K
   2           Reserved value
   3           Iterated and Salted S2K
   100 to 110  Private/Experimental S2K

如果您不想搜尋 GPG 原始碼,我不久前編寫了自己的 OpenPGP 實現。如果我沒記錯的話,在解密我用 GPG 生成的測試數據時,我發現 GPG 預設使用 Iterated and Salted S2K (S2K3)。

std::string S2K3::run(std::string pass, unsigned int sym_len){
   // get string to hash
   std::string to_hash = "";
   while (to_hash.size() < coded_count(count)){// coded count is count of bytes, not interations
       to_hash += salt + pass;
   }
   to_hash = to_hash.substr(0, coded_count(count));
   // hash string
   std::string out = "";
   unsigned int context = 0;
   while (out.size() < sym_len){
       out += use_hash(hash, std::string(context++, 0) + to_hash);
   }
   return out.substr(0, sym_len);
}

至於你的第二個和第三個問題,我不知道。我希望文件中沒有儲存密碼資訊。我試圖閱讀 GPG 原始碼,但沒有這樣做。它非常龐大和復雜。

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