web-dev-qa-db-ja.com

ディスク上に新しいファイルを作成せずに、署名されたファイルからgpg署名を削除するにはどうすればよいですか?

インターネット経由でダウンロードした100MBの署名付きバイナリファイルがある場合、それを開くには200MBのディスク容量が必要です。ファイルは署名されているだけで、暗号化されていません。

ディスク容量が少ない場合、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

ディスク容量が少ない場合、gpgfilename.gpgコマンドは失敗します。

3
Elison Niven

ダウンロードプロセスを組み合わせて、次のように1つのパイププロセスで署名を確認できます。

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

はい、ディスク容量を増やすことなく、最初と最後からバイトを取り除くことができます。ただし、ほとんどのユーティリティは、ファイルを新しいファイルにコピーし、古いファイルを削除してから、新しいファイルの名前を古いファイルと同じに変更します。 gpgがこのカテゴリに含まれると想定しても安全だと思います。もちろん、これはファイルに必要な2倍のディスク容量を使用します。

あなたがする必要があるのは:

  1. ファイルのバイトをPGPヘッダーのサイズだけ「下」にインプレース移動します
  2. ファイルの長さを設定して、PGPトレーラーを削除します

適切なユーティリティがあれば、これを1つのステップで実行することも可能であり、これを実行するCプログラムを簡単に作成できます。

ただし、すでに利用可能なツールだけでそれを実行したいと思います。実際、これはddで行うことができます。

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

これは、ヘッダーの長さが49バイトであることを前提としています。 (YMMV)

次に、ファイルを正しい長さに切り捨てる必要があります。 GNU truncateには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
1
Neil Mayhew