Читатель формата подписи PGP

В моем проекте мне нужно проверить подписанные подписи PGP с помощью соответствующего открытого ключа. Хотя мне удалось найти код, который это делает (например: pgp/PgpUtil.java" rel="nofollow">https://github.com/cjmalloy/openbitpub/blob/64485d64a699eb6096f01b27d5f7e51dd726602f/src/main/java/com/cjmalloy/obp/server/pgp/PgpUtil.java), он работает на низком уровне и выглядит довольно ужасно.

Я подумал, возможно, существуют какие-то специализированные парсеры, которые могут потреблять блоки -----BEGIN PGP PUBLIC KEY BLOCK-----xxx-----END PGP PUBLIC KEY BLOCK----- и -----BEGIN PGP SIGNED MESSAGE-----xxx-----BEGIN PGP SIGNATURE-----xxx-----END PGP SIGNATURE-----, чтобы я мог проверять подписи более декларативным способом?

Я нашел связанный класс PEMReader из пакета bouncycastle.openssl, но пока ничего не связанного с PGP.


person src091    schedule 01.11.2015    source источник


Ответы (3)


Я подумал, возможно, существуют какие-то специализированные парсеры, которые могут потреблять блоки -----BEGIN PGP PUBLIC KEY BLOCK-----xxx-----END PGP PUBLIC KEY BLOCK----- и -----BEGIN PGP SIGNED MESSAGE-----xxx-----BEGIN PGP SIGNATURE-----xxx-----END PGP SIGNATURE-----, чтобы я мог проверять подписи более декларативным способом?

Парсера будет недостаточно — вам нужно будет реализовать множество специфичных для OpenPGP функций, таких как получение симметричного ключа из строк (для зашифрованных ключей), обработка различных типов асимметричных криптографических алгоритмов, хэш-суммы, различные виды вложенности пакетов. , ... -- по крайней мере, вам не требуется реализовывать режим CBC OpenPGP, поскольку вам не требуется шифрование (только подписи).

OpenPGP намного слишком сложен для написания собственного синтаксического анализатора и криптографического кода, вместо этого полагайтесь на существующие библиотеки. В конце концов, с Java у вас есть два возможных пути:

  • Использование GnuPG через интерфейс Java GPGME, для чего требуется локальная установка GnuPG.
  • Использование Bouncy Castle для Java, которое имеет довольно полную реализацию OpenPGP в родном коде Java, но потребует от вас выполнять все криптооперации в Java. Документация в основном состоит из JavaDoc для пакета OpenPGP.

Я нашел связанный класс PEMReader из пакета bouncycastle.openssl, но пока ничего не связанного с PGP.

Вероятно, вы искали не тот пакет BouncyCastle. OpenPGP не использует ключи в формате PEM (который относится к стандарту X.509), поэтому этот класс вообще не будет полезен.

person Jens Erat    schedule 01.11.2015
comment
Конечно, я собираюсь использовать bouncycastle.openpgp для проверки подписи, собственно, я и делаю это сейчас. Просто много кода, который у меня есть, на самом деле анализируется (можно увидеть в приведенном примере, таком как построчное чтение, выбрасывание разрывов строк и т. д.). Я понимаю, что PEMReader не совсем то, что мне нужно, но близко. Существование PEMReader заставляет задуматься, существует ли нечто подобное для PGP. - person src091; 02.11.2015
comment
Я никогда не работал с Bouncy Castle, но, насколько я знаю, вам придется импортировать открытый ключ, загрузить подписанный файл (посмотрите gpg --list-packets, чтобы понять, как их демаршалировать, если это необходимо в Bouncy Castle) и, наконец, выполнить проверку. Документация помимо JavaDoc встречается редко, вы можете найти несколько разумных примеров в других местах в Интернете. - person Jens Erat; 02.11.2015
comment
Только приватный ключ нужен S2K; проверить использует открытый ключ. В остальном согласен. - person dave_thompson_085; 04.11.2015

Я попадал в ту же ситуацию иногда назад.

Это было решено с помощью зависимости надувного замка и с помощью метода

decryptAndVerify(InputStream in, OutputStream fOut, InputStream publicKeyIn, InputStream keyIn, char[] passwd)

в классе утилит PGP

person Black_Panther    schedule 24.07.2020

Коммерческая библиотека OpenPGP для Java предлагает удобный API для проверки подписей открытым текстом. Пример кода:

import com.didisoft.pgp.*;
 
public class VerifyFile {
    public static void main(String[] args) throws Exception{
        // create an instance of the library
        PGPLib pgp = new PGPLib();
 
        // verify and extract the signed content
        SignatureCheckResult signatureCheck = pgp.verifyAndExtract("signed.pgp", "sender_public_key.asc", "OUTPUT.txt");      
        if (signatureCheck == SignatureCheckResult.SignatureVerified) {
            System.out.println("The signature is valid.");
        } else if (signatureCheck == SignatureCheckResult.SignatureBroken) {
            System.out.println("Message corrupted or signature forged");
        } else if (signatureCheck == SignatureCheckResult.PublicKeyNotMatching) {
            System.out.println("Signature not matching provided public key (the message is from another sender)");
        } else {
              System.out.println("No signature found in message");
        }
    }
}

Отказ от ответственности: я работаю в DidiSoft.

person Peter Kalef ' DidiSoft    schedule 25.07.2020