using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace HashCheck
{
   class Program
   {
      static void Main(string[] args)
      {
         string verifiableMessage = "To były najlepsze czasy, to były najgorsze czasy.";
         string wrongMessage = "To były najlepsze czasy to były najgorsze czasy.";

         SHA1Managed sha = new SHA1Managed();
         byte[] verifiableMessageHash = sha.ComputeHash(
           System.Text.ASCIIEncoding.ASCII.GetBytes(verifiableMessage));
         byte[] wrongMessageHash = sha.ComputeHash(
           System.Text.ASCIIEncoding.ASCII.GetBytes(wrongMessage));

         // zauważmy, że nigdy ręcznie nie deszyfrujemy sygnatury, wykonywane jest to przez weryfikator sygnatury
         FileStream fs = new FileStream(@"..\..\..\..\SignedHash.dat", FileMode.Open);
         byte[] fileHash = new byte[fs.Length];
         fs.Read(fileHash, 0, (int)fs.Length);
         fs.Close();

         // pobierz klucz Joanny potrzebny do odszyfrowania skrótu
         StreamReader sr = File.OpenText(@"..\..\..\..\JanesKey.xml");
         string janesKey = sr.ReadToEnd();
         sr.Close();

         RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
         rsa.FromXmlString(janesKey);

         RSAPKCS1SignatureDeformatter sigDeformatter =
           new RSAPKCS1SignatureDeformatter(rsa);
         sigDeformatter.SetHashAlgorithm("SHA1");
         if (sigDeformatter.VerifySignature(verifiableMessageHash, fileHash))
         {
            Console.WriteLine("Prawdziwa wiadomość została zweryfikowana jako nienaruszona.");
         }
         if (sigDeformatter.VerifySignature(wrongMessageHash, fileHash) == false)
         {
            Console.WriteLine("Sfałszowana wiadomość została zweryfikowana jako fałszywa.");
         }
         else
         {
            Console.WriteLine("Praktycznie, nie powinno się to nigdy wyświetlić.");
         }

         Console.ReadLine();
      }
   }
}
