Как удалить подпись gpg из подписанного файла, не создавая новый файл на диске?

Как удалить подпись gpg из подписанного файла, не создавая новый файл на диске?

Если у меня есть подписанный двоичный файл размером 100 МБ, который я загружаю через интернет, мне нужно 200 МБ дискового пространства, чтобы открыть его. Файл просто подписан, а не зашифрован.

Когда места на диске мало, невозможно получить исходный файл, так как команда 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)

Теперь вам нужно обрезать файл до нужной длины. Есть утилита, называемая truncateв GNU 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

Связанный контент