Musisz mieć klucz publiczny, aby zweryfikować podpis wykonany odpowiednim kluczem prywatnym, ale nie musisz podpisywać ani nawet lokalnie podpisywać klucza. W takim przypadku otrzymasz ostrzeżenie od GPG, że klucz jest niezaufany.
Oto test, który wykonałem za pomocą pliku podpisanego własnym kluczem, ale w systemie, w którym klucz nie został zaimportowany:
[ben@seditious tmp]$ gpg -v --verify thing.txt.gpg
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: Can't check signature: public key not found
[ben@seditious tmp]$ gpg -v --status-fd 1 --verify thing.txt.gpg
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
[GNUPG:] ERRSIG 7FF2D37135C7553C 1 10 00 1380142299 9
[GNUPG:] NO_PUBKEY 7FF2D37135C7553C
gpg: Can't check signature: public key not found
[ben@seditious tmp]$
Niestety sugestia Harry'ego nie działa, wyciąga trochę więcej informacji, ale nie na tyle, by była przydatna.
Jak widać, najwięcej uzyskanych informacji to identyfikator klucza podklucza użytego do złożenia podpisu oraz godzina jego złożenia. To pasuje do danych dostępnych dla pgpdump (lub --list-packets):
bash-3.2$ pgpdump thing.txt.gpg
Old: Compressed Data Packet(tag 8)
Comp alg - ZLIB <RFC1950>(comp 2)
Old: One-Pass Signature Packet(tag 4)(13 bytes)
New version(3)
Sig type - Signature of a binary document(0x00).
Hash alg - SHA512(hash 10)
Pub alg - RSA Encrypt or Sign(pub 1)
Key ID - 0x7FF2D37135C7553C
Next packet - other than one pass signature
Old: Literal Data Packet(tag 11)(24 bytes)
Format - binary
Filename - thing.txt
File modified time - Thu Sep 26 06:51:39 EST 2013
Literal - ...
Old: Signature Packet(tag 2)(412 bytes)
Ver 4 - new
Sig type - Signature of a binary document(0x00).
Pub alg - RSA Encrypt or Sign(pub 1)
Hash alg - SHA512(hash 10)
Hashed Sub: signature creation time(sub 2)(4 bytes)
Time - Thu Sep 26 06:51:39 EST 2013
Sub: issuer key ID(sub 16)(8 bytes)
Key ID - 0x7FF2D37135C7553C
Hash left 2 bytes - f0 97
RSA m^d mod n(3066 bits) - ...
-> PKCS-1
bash-3.2$
Jak widać, zapewnia algorytm mieszania, szczegóły typu klucza (mój klucz podpisujący to 3072-bitowy podklucz RSA i identyfikator klucza podklucza, ale nie ma nic, co mogłoby zidentyfikować klucz główny. Ta informacja jest tylko ujawnione, gdy masz klucz publiczny i zweryfikuj podpis.
Następnie zaimportowałem mój klucz publiczny do tego systemu i spróbowałem ponownie:
[ben@seditious tmp]$ gpg -v --verify thing.txt.gpg
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: using PGP trust model
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg: aka "Ben M <ben.m@REDACTED>"
gpg: aka "Ben M <ben.m@REDACTED>"
gpg: aka "Ben M (backup email address) <benm@REDACTED>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: DB47 24E6 FA42 86C9 2B4E 55C4 321E 4E23 7359 0E5D
Subkey fingerprint: B7F0 FE75 9387 430D D0C5 8BDB 7FF2 D371 35C7 553C
gpg: binary signature, digest algorithm SHA512
[ben@seditious tmp]$
Teraz jest w stanie zidentyfikować klucz i dopasować go do klucza podstawowego. Możliwe jest jednak ograniczenie charakteru takich ostrzeżeń:
[ben@seditious tmp]$ gpg -v --verify --trust-model always thing.txt.gpg
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg: aka "Ben M <ben.m@REDACTED>"
gpg: aka "Ben M <ben.m@REDACTED>"
gpg: aka "Ben M (backup email address) <benm@REDACTED>"
gpg: WARNING: Using untrusted key!
gpg: binary signature, digest algorithm SHA512
[ben@seditious tmp]$
Nadal jest ostrzeżenie, że jest to niezaufany klucz, ale nie tak masowo, a usunięcie gadatliwości ogranicza go tylko do tego:
[ben@seditious tmp]$ gpg --verify --trust-model always thing.txt.gpg
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg: aka "Ben M <ben.m@REDACTED>"
gpg: aka "Ben M <ben.m@REDACTED>"
gpg: aka "Ben M (backup email address) <benm@REDACTED>"
gpg: WARNING: Using untrusted key!
[ben@seditious tmp]$
Klucz publiczny jest wymagany na etapie weryfikacji, ponieważ służy do dopasowania danych wygenerowanych przez osobę podpisującą z ich kluczem prywatnym. Mówiąc najprościej, można go traktować jako uzupełnienie szyfrowania, w którym klucz prywatny jest potrzebny do dekodowania danych zaszyfrowanych na klucz publiczny.
Uwaga: trochę poprawiłem UID w tym przykładzie, ale każdy, kto dostanie ten klucz, zobaczy, kim naprawdę jest. W przeciwnym razie dane wyjściowe to prosta kopia i wklej.
EDYCJA: Możesz wywołać plik klucza publicznego bezpośrednio jak brelok, jeśli masz go w zbrojonym formacie innym niż ASCII (tzn. Plik .gpg zamiast pliku .asc). Mimo to nadal potrzebujesz klucza publicznego. Aby to zrobić, polecenie wygląda następująco:
[ben@seditious ~]$ gpg -v --no-default-keyring --keyring /tmp/mykey.gpg --verify /tmp/thing.txt.gpg
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: using PGP trust model
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg: aka "Ben M (backup email address) <benm@REDACTED>"
gpg: aka "Ben M <ben.m@REDACTED>"
gpg: aka "Ben M <ben.m@REDACTED>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: DB47 24E6 FA42 86C9 2B4E 55C4 321E 4E23 7359 0E5D
Subkey fingerprint: B7F0 FE75 9387 430D D0C5 8BDB 7FF2 D371 35C7 553C
gpg: binary signature, digest algorithm SHA512
[ben@seditious ~]$
gpg --status-fd 1 --verify (thefile)
podaje jako wynik pierwszy odcisk palca klawisza, który utworzył podpis.