Criando uma Assinatura Digital

Os algoritimos utilizados em assinatura digital mapeiam valores de tamanho arbitrário para valores binários de tamanho fixo. O .NET framework possui várias classes que implementam algorítimos de assinatura digital, tais como: 
  • HMACSHA1
  • MACTripleDES
  • MD5CryptoServiceProvider
  • RIPEMD160
  • SHA1Managed
  • SHA256Managed
  • SHA384Managed
  • SHA512Managed 
Quando utilizamos uma classe que implementa uma assinatura digital temos a garantia de que dois conjuntos de valores idênticos terão o mesmo resultado com tamanho fixo. Qualquer pequena alteração no valor fará com que o resultado seja totalmente diferente. 

Segue um exemplo de utilização de uma classe que pode ser utilizada para assinatura digital. O exemplo utiliza a classe SHA256Managed que cria uma assinatura digital para a palavra Romar. 
Para que o exemplo funcione é necessário incluir o namespace System.Security.Cryptography. 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
    class Program
    {
        static void Main(string[] args)
        {
            byte[] dados = Encoding.ASCII.GetBytes("Romar");
            byte[] resultado;
            // Cria um hash para a palavra Romar
            SHA256 shaM = new SHA256Managed();
            resultado = shaM.ComputeHash(dados);
            // Utilizando a classe Encoding
            string palavraCriptografada1 = Encoding.ASCII.GetString(resultado);
            Console.WriteLine("Resultado com a classe Encoding:");
            Console.WriteLine(palavraCriptografada1);
            Console.WriteLine();
            // utilizando a classe BitConverter
            string palavraCriptografada2 = BitConverter.ToString(resultado);
            Console.WriteLine("Resultado com a classe BitConverter:");
            Console.WriteLine(palavraCriptografada2);
            Console.ReadKey();
        }
    }
No exemplo imprimimos o resultado de duas formas; uma exibindo o resultado como uma string utilizando a classe Encoding e a outra utilizando a classe BitConverter. A classe Encoding foi utilizada com o valor ASCII, portanto o resultado é uma string com os valores da assinatura digital exibidos em caracteres que nem sempre são imprimíveis e podem apresentar dificuldade para se armazenar em alguns tipos de arquivos. Uma opção para armazenamento seria trazer o resultado em um formato mais amigável, por exemplo em hexadecimal. A classe BitConverter facilita este trabalho fazendo a conversão do resultado em um array de bytes que pode ser facilmente manipulado e armazenado.

 
Resultado com a classe Encoding:
k?+??$???►?,?4F
?↨B¶v?e☺\???C 




Observando o resultado do exemplo utilizando-se a classe BitConverter podemos observar que temos 32 bytes. A classe SHA256Managed sempre retornará um tamanho fixo de 32 bytes (256 bits).

Resultado com a classe BitConverter:
6B-EC-2B-AE-B9-24-E2-F9-BC-10-D1-2C-D9-34-46-07-0A-87-17-42-14-76-EA-5B-08-65-01
-5C-BD-F1-D5-43