Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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
, hash
e signedHash
vengano forniti da una parte remota. La parte remota ha firmato hash
usando l'algoritmo SHA256
per produrre la firma signedHash
digitale . 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.