Firme di crittografia

Le firme digitali di crittografia usano algoritmi con chiave pubblica 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 altre informazioni sulle firme digitali, vedere Cryptographic Services.

Questo argomento spiega come generare e verificare firme digitali usando le classi nello System.Security.Cryptography spazio dei nomi.

Generare una firma

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 prima di tutto una nuova istanza della classe RSA per generare una coppia di chiavi pubblica/privata. Viene quindi passato RSA a una nuova istanza della classe RSAPKCS1SignatureFormatter . In questo modo la chiave privata viene trasferita a RSAPKCS1SignatureFormatterche esegue l'effettiva apposizione della firma digitale. Prima di firmare il codice hash, è necessario specificare un algoritmo hash da usare. In questo esempio viene utilizzato l'algoritmo SHA256. Infine viene chiamato il metodo CreateSignature per apporre 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 avere le informazioni seguenti:

  • La chiave pubblica della parte che ha firmato i dati.
  • La firma digitale.
  • I dati che sono stati firmati.
  • L'algoritmo hash usato dal firmatario.

Usare la classe RSAPKCS1SignatureFormatter per verificare una firma eseguita dalla classe RSAPKCS1SignatureDeformatter . Alla classe RSAPKCS1SignatureDeformatter 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. Tali valori dovrebbero essere forniti dalla parte che ha generato la coppia di chiavi pubblica/privata. Creare prima di tutto un oggetto RSA per conservare la chiave pubblica che verificherà la firma, quindi inizializzare una struttura RSAParameters per i valori di modulo ed esponente che specificano la chiave pubblica.

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

L’istanza RSA viene a sua volta passata al costruttore di un oggetto RSAPKCS1SignatureDeformatter per trasferire la chiave.

Nell'esempio che segue viene illustrato questo processo. In questo esempio si supponga che sharedParameters, hash e signedHash vengano forniti da una parte remota. La parte remota ha firmato hash usando l'algoritmoSHA256 per produrre la firma digitale signedHash. Il metodo RSAPKCS1SignatureDeformatter.VerifySignature verifica che la firma digitale sia valida e 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.

Vedi anche