如何從簽章檔案中刪除 gpg 簽章而不在磁碟上建立新檔案?

如何從簽章檔案中刪除 gpg 簽章而不在磁碟上建立新檔案?

如果我透過 Internet 下載 100 MB 的簽章二進位文件,則需要 200 MB 的磁碟空間才能開啟它。該文件只是簽名,未加密。

當磁碟空間不足時,由於 gpg 指令失敗,無法取得原始檔案。我看到簽署的gpg檔案是原始檔案+開頭和結尾的一些簽名字節。是否可以從文件中刪除這些位元組而不建立新文件,從而節省磁碟空間?可以使用以下方法驗證簽名:

# gpg --verify filename.gpg

無需在磁碟上建立新檔案。範例工作流程如下所述:

# # Sample workflow
# cd /tmp/new
# wget http://someaddress/filename.gpg
# ls
filename.gpg
# du -h filename.gpg
100M filename.gpg
# gpg filename.gpg
gpg: Signature made Thu May 28 10:53:26 2015 UTC using RSA key ID XXXXXXXXX
gpg: Good signature from "Example <[email protected]>"
# ls
filename filename.gpg
# du -ch *
100M filename
100M filename.gpg
200M total
# rm filename.gpg

當磁碟空間不足時,gpg filename.gpg 指令將會失敗。

答案1

您可以結合下載過程並在一個管道過程中檢查簽名,如下所示:

wget -qO- http://someaddress/filename.gpg|gpg >filename

答案2

是的,您可以從開頭和結尾剝離字節,而無需使用更多磁碟空間。然而,大多數實用程式會將文件複製到新文件,刪除舊文件,然後將新文件重新命名為與舊文件相同。我認為可以安全地假設gpg屬於這一類。當然,這會使用檔案所需磁碟空間的兩倍。

你需要做的是:

  1. 將檔案的位元組就地「向下」移動 PGP 標頭的大小
  2. 設定檔案長度以刪除 PGP 尾部

使用正確的實用程序,甚至可以一步完成此操作,並且可以輕鬆編寫 C 程序來完成此操作。

但是,我假設您只想使用現有的工具來完成此操作。事實上可以透過以下方式做到這一點dd

dd if=filename.gpg of=filename.gpg bs=49 skip=1 conv=notrunc

這是假設標頭的長度為 49 位元組。 (YMMV)

現在您需要將文件截斷到正確的長度。truncateGNU 中有一個實用程序coreutils,它將出現在許多 Unix 系統上。但是,您需要知道預告片的位元組偏移量。這可以透過 GNU 來完成grep

grep -b '^-----BEGIN PGP SIGNATURE-----' filename.gpg

這將輸出類似:

104857600:-----BEGIN PGP SIGNATURE-----

最後一步是將此值與以下內容一起使用truncate

truncate -s 104857600 filename.gpg

但是,如果您已經知道預告片的長度,則可以跳過grep並僅告訴truncate將檔案縮短該位元組數:

truncate -s -103 filename.gpg

相關內容