Signatures de chiffrement

Les signatures numériques de chiffrement utilisent des algorithmes de clé publique pour assurer l'intégrité des données. Quand vous signez des données avec une signature numérique, un tiers peut vérifier la signature et prouver que les données viennent bien de vous et qu'elles n'ont pas été modifiées après que vous les avez signées. Pour plus d’informations sur les signatures numériques, consultez Cryptographic Services.

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

Générer une signature

Les signatures numériques sont généralement appliquées à des valeurs de hachage qui représentent des données plus volumineuses. Dans l'exemple suivant, une signature numérique est appliquée à une valeur de hachage. Dans un premier temps, une nouvelle instance de la classe RSA est créée pour générer une paire de clés publique/privée. Ensuite, RSA est passé à une nouvelle instance de la classe RSAPKCS1SignatureFormatter . Cela a pour effet de transférer la clé privée à RSAPKCS1SignatureFormatter, qui effectue la signature numérique proprement dite. Pour pouvoir signer le code de hachage, vous devez au préalable spécifier l'algorithme de hachage à utiliser. Dans cet exemple, l’algorithme SHA256 est utilisé. Enfin, la méthode CreateSignature est appelée pour effectuer la signature.

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.

Vérifier une signature

Pour vérifier que les données ont été signées par un tiers donné, vous devez disposer des informations suivantes :

  • la clé publique du tiers qui a signé les données ;
  • la signature numérique ;
  • les données qui ont été signées ;
  • l'algorithme de hachage utilisé par le signataire.

Pour vérifier une signature signée par la classe RSAPKCS1SignatureFormatter , utilisez la classe RSAPKCS1SignatureDeformatter . La clé publique du signataire doit être fournie à la classe RSAPKCS1SignatureDeformatter . Pour RSA, vous aurez besoin au minimum des valeurs de RSAParameters.Modulus et RSAParameters.Exponent pour spécifier la clé publique. Une façon d’y parvenir est d’appeler RSA.ExportParameters au moment de la création de la signature, puis RSA.ImportParameters pendant le processus de vérification. Le tiers qui a généré la paire de clés publique/privée doit fournir ces valeurs. Commencez par créer un objet RSA pour contenir la clé publique chargée de vérifier la signature, puis initialisez une structure RSAParameters avec les valeurs du modulo et de l’exposant qui spécifient la clé publique.

Le code suivant illustre le partage d’une structure RSAParameters. Le RSA responsable de la création de la signature exporte ses paramètres. Les paramètres sont ensuite importés dans la nouvelle instance RSA chargée de vérifier la signature.

À son tour, l’instance RSA est transférée au constructeur d’un RSAPKCS1SignatureDeformatter pour transférer la clé.

L'exemple suivant illustre ce processus. Dans cet exemple, imaginez que sharedParameters, hash et signedHash sont fournis par un tiers distant. Le tiers distant a signé hash avec l’algorithme SHA256 pour générer la signature numérique signedHash. La méthode RSAPKCS1SignatureDeformatter.VerifySignature vérifie que la signature numérique est valide et qu’elle a été utilisée pour signer 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.");
    }
}

Ce fragment de code affiche « The signature is valid » si la signature est valide et « The signature is not valid » si elle ne l’est pas.

Voir aussi