Condividi tramite


Firme di crittografia

Le firme digitali di crittografia utilizzano algoritmi pubblici per garantire l'integrità dei dati. Quando viene applicata una firma digitale ai dati, questa può essere verificata da altri e può quindi provare che i dati non sono stati modificati dopo l'applicazione della firma. Per ulteriori informazioni sulle firme digitali, vedere Servizi di crittografia.

In questo argomento viene illustrato come generare e verificare firme digitali utilizzando le classi nello spazio dei nomi System.Security.Cryptography.

  • Generazione di firme

  • Verifica di firme

Generazione di firme

Le firme digitali vengono generalmente applicate a valori hash che rappresentano dati di maggiori dimensioni. Nell'esempio che segue viene applicata una firma digitale a un valore hash. Viene creata innanzitutto una nuova istanza della classe RSACryptoServiceProvider per generare una coppia di chiavi pubblica/privata. Viene quindi passato RSACryptoServiceProvider a una nuova istanza della classe RSAPKCS1SignatureFormatter. In questo modo la chiave privata viene trasferita a RSAPKCS1SignatureFormatter, che esegue l'effettiva apposizione della firma digitale. Prima di firmare il codice hash, è necessario specificare un algoritmo hash da utilizzare. In questo esempio viene utilizzato l'algoritmo SHA1. Infine viene chiamato il metodo RSAPKCS1SignatureFormatter.CreateSignature per eseguire l'apposizione della firma.

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);
   }
}

Firma di file XML

.NET Framework fornisce lo spazio dei nomi System.Security.Cryptography.XML che consente di firmare il codice XML. La firma XML è importante quando si desidera verificare l'origine del linguaggio XML. Se si utilizza ad esempio un servizio di quotazione dei titoli di borsa che utilizza il linguaggio XML, è possibile verificarne l'origine se è presente la firma.

Le classi in questo spazio dei nomi sono conformi alla raccomandazione "XML-Signature Syntax and Processing" del World Wide Web Consortium.

Torna all'inizio

Verifica di firme

Per verificare che i dati siano stati firmati da una determinata parte, è necessario disporre delle informazioni seguenti:

  • La chiave pubblica della parte che ha firmato i dati.

  • La firma digitale.

  • I dati che sono stati firmati.

  • L'algoritmo hash utilizzato dal firmatario.

Utilizzare la classe RSAPKCS1SignatureDeformatter per verificare una firma eseguita dalla classe RSAPKCS1SignatureFormatter. Alla classe RSAPKCS1SignatureDeformatter deve essere fornita la chiave pubblica del firmatario. Sarà necessario disporre dei valori del modulo e l'esponente per specificare la chiave pubblica. Tali valori dovrebbero essere forniti dalla parte che ha generato la coppia di chiavi pubblica/privata. Creare innanzitutto un oggetto RSACryptoServiceProvider per conservare la chiave pubblica che verificherà la firma, quindi inizializzare una struttura RSAParameters ai valori di modulo ed esponente che specificano la chiave pubblica.

Nel codice che segue viene illustrata la creazione di una struttura RSAParameters. La proprietà Modulus è impostata sul valore di una matrice di byte denominata ModulusData e la proprietà Exponent è impostata sul valore di una matrice di byte denominata ExponentData.

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

Dopo aver creato l'oggetto RSAParameters è possibile inizializzare una nuova istanza della classe RSACryptoServiceProvider sui valori specificati in RSAParameters. RSACryptoServiceProvider viene a sua volta passato al costruttore di un oggetto RSAPKCS1SignatureDeformatter per trasferire la chiave.

Nell'esempio che segue viene illustrato questo processo. HashValue e SignedHashValue sono in questo caso matrici di byte fornite da una parte remota che La parte remota ha firmato HashValue utilizzando l'algoritmo SHA1, producendo la firma digitale SignedHashValue. L'attributo

RSAPKCS1SignatureDeformatter.VerifySignature consente di verificare che la firma digitale sia valida e che venga utilizzata per firmare 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.");
}

Nel frammento di codice sarà visualizzato il messaggio "The signature is valid" se la firma è valida e "The signature is not valid" in caso contrario.

Torna all'inizio

Vedere anche

Concetti

Servizi di crittografia

Altre risorse

Attività di crittografia