Partilhar via


Assinaturas de criptografia

Assinaturas digitais criptográficas usam algoritmos de chave pública para fornecer integridade de dados. Quando você assina dados com uma assinatura digital, alguém pode verificar a assinatura e pode provar que os dados originados de você e não foi alterados depois que você assinou. Para obter mais informações sobre assinaturas digitais, consulte Serviços de criptografia.

Este tópico explica como gerar e verificar assinaturas digitais usando as classes de System.Security.Cryptography namespace.

  • Gerando assinaturas

  • Verificando assinaturas

Gerando assinaturas

Assinaturas digitais geralmente são aplicadas aos valores de hash que representam dados maiores. O exemplo a seguir aplica uma assinatura digital para um valor de hash. Primeiro, uma nova instância de RSACryptoServiceProvider classe é criada para gerar um par de chaves pública/particular. Em seguida, o RSACryptoServiceProvider é passado para uma nova instância da RSAPKCS1SignatureFormatter classe. Isso transfere a chave particular para o RSAPKCS1SignatureFormatter, que realmente executa a assinatura digital. Antes de você pode assinar o código hash, você deve especificar um algoritmo de hash para usar. Este exemplo usa o algoritmo SHA1. Finalmente, o RSAPKCS1SignatureFormatter.CreateSignature método é chamado para realizar a assinatura.

Imports System
Imports System.Security.Cryptography

Module Module1
    Sub Main()
        'The hash value to sign.
        Dim HashValue As Byte() = {59, 4, 248, 102, 77, 97, 142, 201, 210, 12, 224, 93, 25, 41, 100, 197, 213, 134, 130, 135}

        'The value to hold the signed value.
        Dim SignedHashValue() As Byte

        'Generate a public/private key pair.
        Dim RSA As New RSACryptoServiceProvider()

        'Create an RSAPKCS1SignatureFormatter object and pass it 
        'the RSACryptoServiceProvider to transfer the private key.
        Dim RSAFormatter As New RSAPKCS1SignatureFormatter(RSA)

        'Set the hash algorithm to SHA1.
        RSAFormatter.SetHashAlgorithm("SHA1")

        'Create a signature for HashValue and assign it to 
        'SignedHashValue.
        SignedHashValue = RSAFormatter.CreateSignature(HashValue)
    End Sub
End Module

using System;
using System.Security.Cryptography;
class Class1
{
   static void Main()
   {
      //The hash value to sign.
      byte[] HashValue = {59,4,248,102,77,97,142,201,210,12,224,93,25,41,100,197,213,134,130,135};

      //The value to hold the signed value.
      byte[] SignedHashValue;

      //Generate a public/private key pair.
      RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

      //Create an RSAPKCS1SignatureFormatter object and pass it the 
      //RSACryptoServiceProvider to transfer the private key.
      RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(RSA);

      //Set the hash algorithm to SHA1.
      RSAFormatter.SetHashAlgorithm("SHA1");

      //Create a signature for HashValue and assign it to 
      //SignedHashValue.
      SignedHashValue = RSAFormatter.CreateSignature(HashValue);
   }
}

Arquivos XML de assinatura.

A.NET Framework fornece a System.Security.Cryptography.XML namespace, que permite que você assinar o XML. Assinatura XML é importante quando você deseja verificar a origem de uma determinada fonte XML. Por exemplo, se você estiver usando um serviço de cotação de ações que usa o XML, você pode verificar a origem do XML, se ele está assinado.

As classes neste namespace siga a recomendação de processamento e a sintaxe de assinatura XML da World Wide Web Consortium.

Voltar ao topo

Verificando assinaturas

Para verificar se os dados foi assinados por uma pessoa específica, você deve ter as seguintes informações:

  • A chave pública de quem assinou os dados.

  • A assinatura digital.

  • Os dados que foi assinados.

  • O algoritmo de hash usado pelo signatário.

Para verificar uma assinatura assinada pela RSAPKCS1SignatureFormatter da classe, use o RSAPKCS1SignatureDeformatter classe. O RSAPKCS1SignatureDeformatter a classe deve ser fornecido a chave pública do signatário. Será necessário que os valores do módulo e o expoente para especificar a chave pública. (A parte que gerou o par de chaves pública/privada deve fornecer esses valores). Primeiro crie um RSACryptoServiceProvider o objeto para armazenar a chave pública que irá verificar a assinatura e, em seguida, inicializar um RSAParameters estrutura para os valores de módulo e o expoente que especificam a chave pública.

O código a seguir mostra a criação de um RSAParameters estrutura. O Modulus for definida como o valor de uma matriz de bytes chamada ModulusData e o Exponent for definida como o valor de uma matriz de bytes chamada ExponentData.

Dim RSAKeyInfo As RSAParameters
RSAKeyInfo.Modulus = ModulusData
RSAKeyInfo.Exponent = ExponentData
RSAParameters RSAKeyInfo;
RSAKeyInfo.Modulus = ModulusData;
RSAKeyInfo.Exponent = ExponentData;

Após você ter criado o RSAParameters o objeto, você pode inicializar uma nova instância da RSACryptoServiceProvider classe para os valores especificados na RSAParameters. O RSACryptoServiceProvider é, por sua vez, passado para o construtor de uma RSAPKCS1SignatureDeformatter para transferir a chave.

O exemplo a seguir ilustra esse processo. Neste exemplo, HashValue e SignedHashValue são matrizes de bytes fornecidos por terceiros remoto. O participante remoto tiver assinado o HashValue usando o algoritmo SHA1, produzindo a assinatura digital SignedHashValue. O

RSAPKCS1SignatureDeformatter.VerifySignaturemétodo verifica se a assinatura digital é válida e foi usada para assinar o HashValue.

Dim RSA As New RSACryptoServiceProvider()
RSA.ImportParameters(RSAKeyInfo)
Dim RSADeformatter As New RSAPKCS1SignatureDeformatter(RSA)
RSADeformatter.SetHashAlgorithm("SHA1")
If RSADeformatter.VerifySignature(HashValue, SignedHashValue) Then
   Console.WriteLine("The signature is valid.")
Else
   Console.WriteLine("The signture is not valid.")
End If
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
RSA.ImportParameters(RSAKeyInfo);
RSAPKCS1SignatureDeformatter RSADeformatter = new RSAPKCS1SignatureDeformatter(RSA);
RSADeformatter.SetHashAlgorithm("SHA1");
if(RSADeformatter.VerifySignature(HashValue, SignedHashValue))
{
   Console.WriteLine("The signature is valid.");
}
else
{
   Console.WriteLine("The signature is not valid.");
}

O fragmento de código exibirá "The signature is valid" Se a assinatura é válida e "The signature is not valid" Se não estiver.

Voltar ao topo

Consulte também

Conceitos

Serviços de criptografia

Outros recursos

Tarefas de criptografia