Проверьте отдельную подпись pgp в c # - PullRequest
0 голосов
/ 08 октября 2019

вот что у меня есть:

  • Большой файл с именем update.zip
  • Текстовый файл с именем update.zip.sha256sum, содержащий ... да, вы догадались, в настоящее время это«204f687dae2e9b66afce079b29abf935949e31de838aa4f5bd8f9b4440fadf2d update.zip» (1 строка)
  • 3-й файл с именем update.zip.sha256sum.asc, содержащий «----- BEGIN PGP SIGNATURE ----- ----- --------- КОНЕЦ ПОДПИСЬ PGP ----- "так что только подпись. Все это на веб-сайте.
  • Тогда, конечно, у меня есть открытый ключ для проверки подписи. Я сделал это ресурсом внутри проекта, так как он не изменится.

Что мне нужно сделать из кода: проверьте, что update.zip не был закален. Поэтому проверьте подпись, которая подтверждает, что файл update.zip.sha256sum в порядке, так что я могу использовать sha256 внутри него, чтобы сравнить с тем, который я вычисляю. Все довольно просто. Проблема в том, что метод verify всегда возвращает false. Работа с настольным приложением работает, поэтому с файлами все в порядке.

Что я сделал: конечно, я прочитал все подобные вопросы, особенно this . Я также прочитал всю документацию о надувном замке. Это было быстро и легко - НЕТ.

Наконец, я использовал один из примеров, а именно тот, который находится под .. \ crypto \ test \ src \ openpgp \ examples \ DetachedSignatureProcessor.cs

, так что вот код (неудачный):

    private static bool VerifySignature(string fileName, Stream inputStream, Stream keyIn)
    {
        inputStream = PgpUtilities.GetDecoderStream(inputStream);

        PgpObjectFactory pgpFact = new PgpObjectFactory(inputStream);
        PgpSignatureList p3 = null;
        PgpObject o = pgpFact.NextPgpObject();

        p3 = (PgpSignatureList)o;


        PgpPublicKeyRingBundle pgpPubRingCollection = new PgpPublicKeyRingBundle(
            PgpUtilities.GetDecoderStream(keyIn));
        Stream dIn = GetStream(fileName);
        PgpSignature sig = p3[0];
        PgpPublicKey key = pgpPubRingCollection.GetPublicKey(sig.KeyId);
        sig.InitVerify(key);

        int ch;
        while ((ch = dIn.ReadByte()) >= 0)
        {
            sig.Update((byte)ch);
        }

        dIn.Close();

        if (sig.Verify())
        {
            Console.WriteLine("signature verified.");
            return true;
        }
        else
        {
            Console.WriteLine("signature verification failed.");
            return false;
        }
    }

    public static Stream GetStream(string stringData)
    {
        MemoryStream stream = new MemoryStream();
        StreamWriter writer = new StreamWriter(stream);
        writer.Write(stringData);
        writer.Flush();
        stream.Position = 0;
        return stream;
    }

Код проходит радостно, но всегда выбирает «проверка подписи не удалась». route.

В чем я не уверен, так это в том, пропущу ли я некоторые шаги или использую не те ингредиенты. Я использую 3 простых файла sha256sum (fileName), файл подписи sha256sum.asc (inputStream) и открытый ключ (keyIN).

1 Ответ

0 голосов
/ 28 октября 2019

Наконец я решил это. Но не спрашивайте, какой шаг имел значение; -)

 public static bool VerifySignature(string fileName, Stream inputStream, Stream keyIn)
    {
        PgpPublicKeyRingBundle pgpPubRingCollection = new PgpPublicKeyRingBundle(keyIn);
        PgpPublicKey pubicKey = pgpPubRingCollection.GetPublicKey(4100000000000000000);    //once I knew the right one, I put it here directly as it won't change anyway
        Stream signaturStrom = PgpUtilities.GetDecoderStream(inputStream);
        PgpObjectFactory pgpWTFactory = new PgpObjectFactory(signaturStrom);
        PgpSignature signtr = ((PgpSignatureList)pgpWTFactory.NextPgpObject())[0];
        signtr.InitVerify(pubicKey);

        try
        {
            Stream dIn = ReadStream(fileName);  // get stream from ext. file

            int ch;
            while ((ch = dIn.ReadByte()) >= 0)
            {
                signtr.Update((byte)ch);
            }
            dIn.Close();

        }
        catch (Exception ex)
        {
            return false;
        }
        if (signtr.Verify())
        {
            Console.WriteLine("signature verified.");
            return true;
        }
        else
        {
            Console.WriteLine("signature verification failed.");
            return false;
        }
    }
...