Signatures de chiffrement

Les signatures numériques de chiffrement utilisent des algorithmes de clé publique pour fournir l'intégrité des données. Lorsque vous signez des données avec une signature numérique, quelqu'un d'autre peut vérifier la signature et prouver que les données proviennent de vous et n'ont pas été modifiées après leur signature. Pour plus d'informations sur les signatures numériques, consultez Services de chiffrement.

Cette rubrique explique comment générer et vérifier des signatures numériques à l'aide des classes dans l'espace de noms System.Security.Cryptography.

  • Génération de signatures

  • Vérification de signatures

Génération de signatures

Les signatures numériques s'appliquent habituellement aux valeurs de hachage qui représentent des données plus grandes. L'exemple suivant applique une signature numérique à une valeur de hachage. D'abord, une nouvelle instance de la classe RSACryptoServiceProvider est créée pour générer une paire de clés publique/privée. Ensuite, RSACryptoServiceProvider est passé à une nouvelle instance de la classe RSAPKCS1SignatureFormatter. Cette opération transfère la clé privée à RSAPKCS1SignatureFormatter qui procède à la signature numérique. Avant de pouvoir signer le code de hachage, vous devez spécifier un algorithme de hachage à utiliser. Cet exemple utilise l'algorithme SHA1. Enfin, la méthode RSAPKCS1SignatureFormatter.CreateSignature est appelée pour effectuer la signature.

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

Signature de fichiers XML

Le .NET Framework fournit l'espace de noms System.Security.Cryptography.XML qui vous permet de signer le contenu XML. La signature XML est importante lorsque vous voulez vérifier que le code XML provient d'une certaine source. Par exemple, si vous utilisez un service de cotation en bourse qui utilise XML, vous pouvez vérifier la source du code XML si celle-ci est signée.

Les classes de cet espace de noms respectent les règles de syntaxe et de traitement des signatures XML (page en anglais) édictées par le World Wide Web Consortium.

Retour au début

Vérification de signatures

Pour vérifier que les données sont signées par une partie particulière, vous devez disposer des informations suivantes :

  • La clé publique de la partie qui a signé les données.

  • La signature numérique.

  • Les données qui ont été signées.

  • L'algorithme de hachage utilisé par la partie qui a signé.

Pour vérifier une signature signée par la classe RSAPKCS1SignatureFormatter, utilisez la classe RSAPKCS1SignatureDeformatter. La classe RSAPKCS1SignatureDeformatter doit disposer de la clé publique du signataire. Vous aurez besoin des valeurs du modulo et de l'exposant pour spécifier la clé publique. (La partie qui a généré la paire de clés publique/privée doit fournir ces valeurs.) Créez tout d'abord un objet RSACryptoServiceProvider pour stocker la clé publique qui vérifie la signature, puis initialisez une structure RSAParameters aux valeurs de l'exposant et du modulo qui spécifient la clé publique.

Le code suivant montre la création d'une structure RSAParameters. La valeur d'un tableau d'octets nommé ModulusData est affectée à la propriété Modulus et la valeur d'un tableau d'octets nommé ExponentData est affectée à la propriété Exponent.

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

Après avoir créé l'objet RSAParameters, vous pouvez initialiser une nouvelle instance de RSACryptoServiceProvider aux valeurs spécifiées dans RSAParameters. Le RSACryptoServiceProvider, à son tour, est passé au constructeur d'un RSAPKCS1SignatureDeformatter pour transférer la clé.

L'exemple suivant illustre ce processus. Dans cet exemple, HashValue et SignedHashValue sont des tableaux d'octets fournis par une partie distante. La partie distante a signé HashValue à l'aide de l'algorithme SHA1, produisant ainsi la signature numérique SignedHashValue. La méthode

RSAPKCS1SignatureDeformatter.VerifySignature vérifie que la signature numérique est valide et a été utilisée pour signer 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.");
}

Ce fragment de code affichera « The signature is valid si la signature est valide et « The signature is not valid dans le cas contraire.

Retour au début

Voir aussi

Concepts

Services de chiffrement

Autres ressources

Tâches de chiffrement