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
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