Como remover a assinatura gpg de um arquivo assinado sem criar um novo arquivo no disco?

Como remover a assinatura gpg de um arquivo assinado sem criar um novo arquivo no disco?

Se eu tiver um arquivo binário assinado de 100 MB que baixei da Internet, preciso de 200 MB de espaço em disco para abri-lo. O arquivo está apenas assinado, não criptografado.

Quando o espaço em disco é baixo, não é possível obter o arquivo original porque o comando gpg falha. Vi que o arquivo gpg assinado é o arquivo original + alguns bytes de assinatura no início e no final. É possível retirar esses bytes do arquivo sem criar um novo arquivo, economizando espaço em disco? A assinatura pode ser verificada usando:

# gpg --verify filename.gpg

sem criar um novo arquivo no disco. Um exemplo de fluxo de trabalho é descrito abaixo:

# # 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

Quando o espaço em disco estiver baixo, o comando gpg filename.gpg falhará.

Responder1

Você pode combinar o processo de download e verificar a assinatura em um processo canalizado como este:

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

Responder2

Sim, você pode remover bytes do início e do fim sem usar mais espaço em disco. A maioria dos utilitários, entretanto, copiará o arquivo para um novo arquivo, excluirá o antigo e, em seguida, renomeará o novo para ser igual ao antigo. Acho que é seguro assumir gpgque está nesta categoria. Isso usa o dobro do espaço em disco necessário para o arquivo, é claro.

O que você precisa fazer é:

  1. No local, mova os bytes do arquivo "para baixo" pelo tamanho do cabeçalho PGP
  2. Defina o comprimento do arquivo para remover o trailer PGP

Com o utilitário certo, seria possível fazer isso em uma única etapa, e seria fácil escrever um programa em C para fazer exatamente isso.

No entanto, presumo que você queira fazer isso apenas com as ferramentas já disponíveis. Na verdade, é possível fazer isso com dd:

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

Isso pressupõe que o cabeçalho tenha 49 bytes. (YMMV)

Agora você precisa truncar o arquivo no comprimento correto. Existe um utilitário chamado truncateGNU coreutilsque estará presente em muitos sistemas Unix. No entanto, você precisa saber o deslocamento de bytes do trailer. Isso pode ser feito com GNU grep:

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

Isso produzirá algo como:

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

A etapa final é usar esse valor com truncate:

truncate -s 104857600 filename.gpg

No entanto, se você já sabe o comprimento do trailer, pode pular grepe apenas dizer truncatepara encurtar o arquivo por esse número de bytes:

truncate -s -103 filename.gpg

informação relacionada