Firme di crittografiaCryptographic Signatures

Le firme digitali di crittografia usano algoritmi con chiave pubblica per garantire l'integrità dei dati.Cryptographic digital signatures use public key algorithms to provide data integrity. 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.When you sign data with a digital signature, someone else can verify the signature, and can prove that the data originated from you and was not altered after you signed it. Per altre informazioni sulle firme digitali, vedere Cryptographic Services.For more information about digital signatures, see Cryptographic Services.

Questo argomento spiega come generare e verificare firme digitali usando le classi nello System.Security.Cryptographyspazio dei nomi.This topic explains how to generate and verify digital signatures using classes in the System.Security.Cryptography namespace.

Generazione di firmeGenerating Signatures

Le firme digitali vengono generalmente applicate a valori hash che rappresentano dati di maggiori dimensioni.Digital signatures are usually applied to hash values that represent larger data. Nell'esempio che segue viene applicata una firma digitale a un valore hash.The following example applies a digital signature to a hash value. Viene creata prima di tutto una nuova istanza della classe RSACryptoServiceProvider per generare una coppia di chiavi pubblica/privata.First, a new instance of the RSACryptoServiceProvider class is created to generate a public/private key pair. Viene quindi passato RSACryptoServiceProvider a una nuova istanza della classe RSAPKCS1SignatureFormatter .Next, the RSACryptoServiceProvider is passed to a new instance of the RSAPKCS1SignatureFormatter class. In questo modo la chiave privata viene trasferita a RSAPKCS1SignatureFormatterche esegue l'effettiva apposizione della firma digitale.This transfers the private key to the RSAPKCS1SignatureFormatter, which actually performs the digital signing. Prima di firmare il codice hash, è necessario specificare un algoritmo hash da usare.Before you can sign the hash code, you must specify a hash algorithm to use. Questo esempio usa l'algoritmo SHA1.This example uses the SHA1 algorithm. Infine viene chiamato il metodo CreateSignature per apporre la firma.Finally, the CreateSignature method is called to perform the signing.

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 XMLSigning XML Files

.NET Framework fornisce lo spazio dei nomi System.Security.Cryptography.Xml che consente di firmare il codice XML.The .NET Framework provides the System.Security.Cryptography.Xml namespace, which enables you sign XML. La firma XML è importante quando si vuole verificare l'origine del linguaggio XML.Signing XML is important when you want to verify that the XML originates from a certain source. Se si usa ad esempio un servizio di quotazione dei titoli di borsa che usa il linguaggio XML, è possibile verificarne l'origine se è presente la firma.For example, if you are using a stock quote service that uses XML, you can verify the source of the XML if it is signed.

Le classi in questo spazio dei nomi conformi il indicazione di elaborazione e alla sintassi XML firma dal World Wide Web Consortium.The classes in this namespace follow the XML-Signature Syntax and Processing recommendation from the World Wide Web Consortium.

Torna all'inizioBack to top

Verifica di firmeVerifying Signatures

Per verificare che i dati siano stati firmati da una determinata parte, è necessario avere le informazioni seguenti:To verify that data was signed by a particular party, you must have the following information:

  • La chiave pubblica della parte che ha firmato i dati.The public key of the party that signed the data.

  • La firma digitale.The digital signature.

  • I dati che sono stati firmati.The data that was signed.

  • L'algoritmo hash usato dal firmatario.The hash algorithm used by the signer.

Usare la classe RSAPKCS1SignatureFormatter per verificare una firma eseguita dalla classe RSAPKCS1SignatureDeformatter .To verify a signature signed by the RSAPKCS1SignatureFormatter class, use the RSAPKCS1SignatureDeformatter class. Alla classe RSAPKCS1SignatureDeformatter deve essere fornita la chiave pubblica del firmatario.The RSAPKCS1SignatureDeformatter class must be supplied the public key of the signer. Sarà necessario avere i valori del modulo e l'esponente per specificare la chiave pubblica.You will need the values of the modulus and the exponent to specify the public key. Tali valori dovrebbero essere forniti dalla parte che ha generato la coppia di chiavi pubblica/privata. Creare innanzitutto un RSACryptoServiceProvider oggetto che contenga la chiave pubblica che verificherà la firma, quindi inizializzare un RSAParameters struttura ai valori di modulo ed esponente che specificano la chiave pubblica.(The party that generated the public/private key pair should provide these values.) First create an RSACryptoServiceProvider object to hold the public key that will verify the signature, and then initialize an RSAParameters structure to the modulus and exponent values that specify the public key.

Il codice seguente illustra la creazione di una struttura RSAParameters .The following code shows the creation of an RSAParameters structure. 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.The Modulus property is set to the value of a byte array called ModulusData and the Exponent property is set to the value of a byte array called ExponentData.

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

Dopo avere creato l'oggetto RSAParameters , è possibile inizializzare una nuova istanza della classe RSACryptoServiceProvider per i valori specificati in RSAParameters.After you have created the RSAParameters object, you can initialize a new instance of the RSACryptoServiceProvider class to the values specified in RSAParameters. RSACryptoServiceProvider viene a sua volta passato al costruttore di un oggetto RSAPKCS1SignatureDeformatter per trasferire la chiave.The RSACryptoServiceProvider is, in turn, passed to the constructor of an RSAPKCS1SignatureDeformatter to transfer the key.

Nell'esempio che segue viene illustrato questo processo.The following example illustrates this process. HashValue e SignedHashValue sono in questo caso matrici di byte fornite da una parte remota.In this example, HashValue and SignedHashValue are arrays of bytes provided by a remote party. La parte remota ha firmato HashValue usando l'algoritmo SHA1, producendo la firma digitale SignedHashValue.The remote party has signed the HashValue using the SHA1 algorithm, producing the digital signature SignedHashValue. Alla classeThe

metodo RSAPKCS1SignatureDeformatter.VerifySignature verifica che la firma digitale sia valida e usata per firmare il HashValue.RSAPKCS1SignatureDeformatter.VerifySignature method verifies that the digital signature is valid and was used to sign the 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.This code fragment will display "The signature is valid" if the signature is valid and "The signature is not valid" if it is not.

Vedere ancheSee Also

Cryptographic ServicesCryptographic Services