вот что у меня есть:
- Большой файл с именем 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).