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

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

インターネット経由でダウンロードした 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

次のように、ダウンロード プロセスと署名のチェックを 1 つのパイプ プロセスに組み合わせることができます。

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

答え2

はい、ディスク容量を増やさずに先頭と末尾からバイトを削除できます。ただし、ほとんどのユーティリティは、ファイルを新しいファイルにコピーし、古いファイルを削除してから、新しいファイルの名前を古いファイルと同じ名前に変更します。これはgpgこのカテゴリに入ると考えて間違いないと思います。もちろん、これによりファイルに必要なディスク容量の 2 倍が使用されます。

必要なことは次のとおりです。

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

適切なユーティリティを使用すると、これを 1 つのステップで実行することもでき、これを行うための C プログラムを簡単に作成することもできます。

しかし、すでに利用可能なツールだけで実行したいとお考えでしょう。実際には、次のツールで実行できますdd

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

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

次に、ファイルを正しい長さに切り詰める必要があります。多くの Unix システムに搭載されているtruncateGNUというユーティリティがありますcoreutils。ただし、トレーラーのバイト オフセットを知っておく必要があります。これは 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

関連情報