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

2

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

Quando o espaço em disco é baixo, não é possível obter o arquivo original quando o comando gpg falha. Eu vi que o arquivo gpg assinado é o arquivo original + alguns bytes de assinatura no início e no final. É possível remover 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 fluxo de trabalho de amostra é 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 é baixo, o comando gpg filename.gpg falhará.

    
por Elison Niven 28.05.2015 / 13:47

2 respostas

1

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

wget -qO- http://someaddress/filename.gpg|gpg >filename
    
por 28.05.2015 / 13:54
1

Sim, você pode retirar bytes do começo e do fim sem usar mais espaço em disco. A maioria dos utilitários, no entanto, copia o arquivo para um novo arquivo, exclui o antigo e renomeia o novo como o antigo. Acho que é seguro assumir que gpg está nessa categoria. Isso usa o dobro do espaço em disco necessário para o arquivo, é claro.

O que você precisa fazer é:

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

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

No entanto, suponho 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

Isto é no pressuposto de que o cabeçalho tem 49 bytes de comprimento. (YMMV)

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

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

Isso produzirá algo como:

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

O passo final é usar esse valor com truncate :

truncate -s 104857600 filename.gpg

No entanto, se você já conhece a duração do trailer, pode pular o grep e apenas informar truncate para encurtar o arquivo por esse número de bytes:

truncate -s -103 filename.gpg
    
por 27.10.2015 / 00:20