Condividi tramite


Firme crittografiche

Le firme digitali crittografiche usano algoritmi di chiave pubblica per fornire l'integrità dei dati. Quando si firmano i dati con una firma digitale, un altro utente può verificare la firma e può dimostrare che i dati sono stati originati dall'utente e non sono stati modificati dopo la firma. Per altre informazioni sulle firme digitali, vedere Servizi di crittografia.

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

Generare una firma

Le firme digitali vengono in genere applicate ai valori hash che rappresentano dati più grandi. Nell'esempio seguente viene applicata una firma digitale a un valore hash. Prima di tutto, viene creata una nuova istanza della RSA classe per generare una coppia di chiavi pubblica/privata. RSA Viene quindi passato a una nuova istanza della RSAPKCS1SignatureFormatter classe . In questo modo la chiave privata viene trasferita a RSAPKCS1SignatureFormatter, che esegue effettivamente la firma digitale. Prima di poter firmare il codice hash, è necessario specificare un algoritmo hash da usare. In questo esempio viene utilizzato l'algoritmo SHA256 . Infine, viene chiamato il CreateSignature metodo per eseguire la firma.

Imports System.Security.Cryptography
Imports System.Text

Module Program
    Sub Main()

        Dim alg As SHA256 = SHA256.Create()

        Dim data As Byte() = Encoding.UTF8.GetBytes("Hello, from the .NET Docs!")
        Dim hash As Byte() = alg.ComputeHash(data)

        Dim sharedParameters As RSAParameters
        Dim signedHash As Byte()

        ' Generate signature
        Using rsa As RSA = RSA.Create()
            sharedParameters = rsa.ExportParameters(True)
            Dim rsaFormatter As New RSAPKCS1SignatureFormatter(rsa)
            rsaFormatter.SetHashAlgorithm(NameOf(SHA256))

            signedHash = rsaFormatter.CreateSignature(hash)
        End Using

        ' The sharedParameters, hash, and signedHash are used to later verify the signature.
    End Sub
End Module
using System.Security.Cryptography;
using System.Text;

using SHA256 alg = SHA256.Create();

byte[] data = Encoding.ASCII.GetBytes("Hello, from the .NET Docs!");
byte[] hash = alg.ComputeHash(data);

RSAParameters sharedParameters;
byte[] signedHash;

// Generate signature
using (RSA rsa = RSA.Create())
{
    sharedParameters = rsa.ExportParameters(false);

    RSAPKCS1SignatureFormatter rsaFormatter = new(rsa);
    rsaFormatter.SetHashAlgorithm(nameof(SHA256));

    signedHash = rsaFormatter.CreateSignature(hash);
}

// The sharedParameters, hash, and signedHash are used to later verify the signature.

Verificare una firma

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

  • Chiave pubblica dell'entità che ha firmato i dati.
  • Firma digitale.
  • I dati che sono stati firmati.
  • Algoritmo hash utilizzato dal firmatario.

Per verificare una firma firmata dalla RSAPKCS1SignatureFormatter classe , usare la RSAPKCS1SignatureDeformatter classe . Alla RSAPKCS1SignatureDeformatter classe deve essere fornita la chiave pubblica del firmatario. Per RSA, è necessario avere almeno i valori di RSAParameters.Modulus e RSAParameters.Exponent per specificare la chiave pubblica. Un modo per ottenere questo risultato consiste nel chiamare RSA.ExportParameters durante la creazione della firma e quindi chiamare RSA.ImportParameters durante il processo di verifica. L'entità che ha generato la coppia di chiavi pubblica/privata deve fornire questi valori. Creare prima di tutto un RSA oggetto per contenere la chiave pubblica che verificherà la firma e quindi inizializzare una RSAParameters struttura sui valori modulo ed esponente che specificano la chiave pubblica.

Il codice seguente illustra la condivisione di una RSAParameters struttura. L'oggetto RSA responsabile della creazione della firma esporta i relativi parametri. I parametri vengono quindi importati nella nuova RSA istanza responsabile della verifica della firma.

A sua volta, l'istanza RSA è passata al costruttore di un RSAPKCS1SignatureDeformatter per trasferire la chiave.

Nell'esempio seguente viene illustrato questo processo. In questo esempio si supponga che sharedParameters, hashe signedHash vengano forniti da una parte remota. La parte remota ha firmato hash usando l'algoritmo SHA256 per produrre la firma signedHashdigitale . Il RSAPKCS1SignatureDeformatter.VerifySignature metodo verifica che la firma digitale sia valida ed è stata usata per firmare hash.

Imports System.Security.Cryptography
Imports System.Text

Module Program
    Sub Main()

        Dim alg As SHA256 = SHA256.Create()

        Dim data As Byte() = Encoding.UTF8.GetBytes("Hello, from the .NET Docs!")
        Dim hash As Byte() = alg.ComputeHash(data)

        Dim sharedParameters As RSAParameters
        Dim signedHash As Byte()

        ' Generate signature
        Using rsa As RSA = RSA.Create()
            sharedParameters = rsa.ExportParameters(True)
            Dim rsaFormatter As New RSAPKCS1SignatureFormatter(rsa)
            rsaFormatter.SetHashAlgorithm(NameOf(SHA256))

            signedHash = rsaFormatter.CreateSignature(hash)
        End Using

        ' Verify signature
        Using rsa As RSA = RSA.Create()
            rsa.ImportParameters(sharedParameters)

            Dim rsaDeformatter As New RSAPKCS1SignatureDeformatter(rsa)
            rsaDeformatter.SetHashAlgorithm(NameOf(SHA256))

            If rsaDeformatter.VerifySignature(hash, signedHash) Then
                Console.WriteLine("The signature is valid.")
            Else
                Console.WriteLine("The signature is not valid.")
            End If
        End Using
    End Sub
End Module
using System.Security.Cryptography;
using System.Text;

using SHA256 alg = SHA256.Create();

byte[] data = Encoding.ASCII.GetBytes("Hello, from the .NET Docs!");
byte[] hash = alg.ComputeHash(data);

RSAParameters sharedParameters;
byte[] signedHash;

// Generate signature
using (RSA rsa = RSA.Create())
{
    sharedParameters = rsa.ExportParameters(false);

    RSAPKCS1SignatureFormatter rsaFormatter = new(rsa);
    rsaFormatter.SetHashAlgorithm(nameof(SHA256));

    signedHash = rsaFormatter.CreateSignature(hash);
}

// Verify signature
using (RSA rsa = RSA.Create())
{
    rsa.ImportParameters(sharedParameters);

    RSAPKCS1SignatureDeformatter rsaDeformatter = new(rsa);
    rsaDeformatter.SetHashAlgorithm(nameof(SHA256));

    if (rsaDeformatter.VerifySignature(hash, signedHash))
    {
        Console.WriteLine("The signature is valid.");
    }
    else
    {
        Console.WriteLine("The signature is not valid.");
    }
}

Questo frammento di codice visualizza "The signature is valid" se la firma è valida e "The signature is not valid" in caso contrario.

Vedere anche