簽章和加密與加密和簽章 - GPG 有何作用?

簽章和加密與加密和簽章 - GPG 有何作用?

我已經閱讀了討論我們應該先簽名然後加密,還是先加密然後再簽名?和紙S/MIME、PKCS#7、MOSS、PEM、PGP 和 XML 中的簽章和加密有缺陷。我的問題與 gpg 正在做什麼有關。這有點難以經驗辨別,因為輸出:

gpg --encrypt --sign <filename>

每次運行時都會發生變化。 (為什麼?)

@Jens 解釋說部分原因是包含了時間戳記。有什麼辦法可以消除嗎?我沒有看到 gpg 選項。

由於選項的順序可能沒有區別,並且由於我無法使用該--detach-sign選項(無論如何只生成一個輸出檔案),我懷疑輸出表示:

\begin{equation}
E_r (msg\  \| \ E_s (\#msg))
\end{equation}

其中$E_r$是使用接收者公鑰進行的加密,$E_s$是使用發送者私鑰進行的加密,$msg$是訊息,$\#msg$是訊息的雜湊值,$\|$是串聯。IE。這將是“簽署訊息然後加密”。它是否正確?

或者是:

\begin{equation}
E_r (msg) \  \| \ E_s (\#msg)
\end{equation}

換句話說,它是“加密然後使用明文簽名嗎?”我假設是不是“加密然後簽署密文”,($E_r (msg) \ \| \ E_s (\# E_r (msg))$)因為這與上述論文中的第 1.2 節相反。

@Jens 解釋說,這確實是「簽署訊息然後加密」。那我們如何“使用純文字加密然後簽署”,輸出一個單一 openpgp 文件,而不是兩個文件,一個是加密數據,另一個是簽名?

另外,我已經閱讀了論文和手冊 - 除了程式碼本身之外,我還可以去哪裡找呢?

@Jens 建議運行:

echo 'foo' | gpg --recipient [key-id] --encrypt --sign | gpg --list-packets 

我運行它,對自己加密並找到下面的輸出。有人可以解釋一下它告訴我們什麼嗎?

[...]
gpg: okay, we are the anonymous recipient.
:encrypted data packet:
    length: unknown
    mdc_method: 2
gpg: encrypted with RSA key, ID 00000000
:compressed packet: algo=2
:onepass_sig packet: keyid C6701618143AFA1E
    version 3, sigclass 0x00, digest 10, pubkey 1, last=1
:literal data packet:
    mode b (62), created 1443494042, name="",
    raw data: 4 bytes
:signature packet: algo 1, keyid C6701618143AFA1E
    version 4, created 1443494042, md5len 0, sigclass 0x00
    digest algo 10, begin of digest d7 3a
    hashed subpkt 2 len 4 (sig created 2015-09-29)
    subpkt 16 len 8 (issuer key ID C6701618143AFA1E)
    data: [4095 bits]

答案1

這有點難以經驗辨別,因為輸出:

gpg --encrypt --sign <filename>

每次運行時都會發生變化。 (為什麼?)

這有兩個原因:

  1. OpenPGP 中的對稱加密使用隨機初始化向量(或更確切地說,具有固定初始化向量的類似構造)
  2. 包括簽名創建時間戳。

簽章和加密與加密和簽章 - gpg 的作用是什麼?

GnuPG 首先對訊息進行簽名,然後對其進行加密。您可以使用以下方法驗證這一點gpg --list-packets

echo 'foo' | gpg --recipient [key-id] --encrypt --sign | gpg --list-packets

首先對訊息進行簽名,然後根據資料包的順序進行加密。

從我的理解來看RFC 4880、OpenPGP,但這兩個順序都已定義:OpenPGP 訊息可以是簽名、加密、壓縮和文字數據,而簽名應用於 OpenPGP 訊息,解密的訊息也必須形成 OpenPGP 訊息。

相關內容