Podpis cyfrowy oraz weryfikacja pakietu

W .NET bardzo łatwo podpisać cyfrowo jakiś pakiet. Przeważnie korzystając z WCF czy z innych technologii jest już to wykonane za nas w ramach framework’a. Bardzo często jednak pisząc aplikacje, chcemy zapewnić integralność danych. Za pomocą kilku linii kodu można tego dokonać. Przede wszystkim warto przyjrzeć się klasom RSACryptoServiceProvider  oraz DSACryptoServiceProvider. Obie posiadają one metody takie jak SignData oraz VerifyData.

Przyjrzymy się najpierw samemu podpisowi:

private static byte[] SignData(byte[] data,out RSAParameters cspParameters)
{
  var rsaCryptoServiceProvider=new RSACryptoServiceProvider();
  cspParameters = rsaCryptoServiceProvider.ExportParameters(false);
  return rsaCryptoServiceProvider.SignData(data, new SHA1Managed());            
}

Co metoda SignData robi? Najpierw wykonuje funkcję haszującą na danych, za pomocą algorytmu przekazanego jako drugi parametr. Potem używając klucza prywatnego, szyfruje dany hash. Zaszyfrowany kluczem prywatnym skrót stanowi podpis. Następnie możemy sprawdzić, czy przekazane nam dane, rzeczywiście pokrywają się z podpisem:

private static bool VerifyData(byte[] data, byte[] signature, RSAParameters cspParameters)
{
  var rsaCryptoServiceProvider = new RSACryptoServiceProvider();
  rsaCryptoServiceProvider.ImportParameters(cspParameters);
  return rsaCryptoServiceProvider.VerifyData(data, new SHA1Managed(), signature);
}

Aby zweryfikować integralność danych należy najpierw wyliczyć skrót przekazanego pakietu. Następnie, korzystając z klucza publicznego, odszyfrowujemy podpis. Jeśli podany hash (z podpisu) pokrywa się z tym co sami wyliczyliśmy to znaczy, że pakiet nie został po drodze zmodyfikowany oraz należy do tej osoby, która wydała nam klucz publiczny.

Całość:

private static void Main(string[] args)
{
  string text = "Hello World";
  byte[] data = Encoding.ASCII.GetBytes(text);

  RSAParameters rsaParameters;
  byte[] signature = SignData(data, out rsaParameters);
  Console.WriteLine(VerifyData(data, signature, rsaParameters));
}
private static bool VerifyData(byte[] data, byte[] signature, RSAParameters cspParameters)
{
  var rsaCryptoServiceProvider = new RSACryptoServiceProvider();
  rsaCryptoServiceProvider.ImportParameters(cspParameters);
  return rsaCryptoServiceProvider.VerifyData(data, new SHA1Managed(), signature);
}

private static byte[] SignData(byte[] data,out RSAParameters cspParameters)
{
  var rsaCryptoServiceProvider=new RSACryptoServiceProvider();
  cspParameters = rsaCryptoServiceProvider.ExportParameters(false);

One thought on “Podpis cyfrowy oraz weryfikacja pakietu”

Leave a Reply

Your email address will not be published.