Partager via


Signatures de chiffrement

Les signatures numériques de chiffrement utilisent des algorithmes de clé publique pour assurer 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 une fois que vous l’avez signée. 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 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 aux valeurs de hachage qui représentent des données plus volumineuses. L’exemple suivant applique une signature numérique à une valeur de hachage. Tout d’abord, une nouvelle instance de la RSA classe 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 transfère la clé privée au RSAPKCS1SignatureFormatter, qui effectue réellement 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 SHA256 . Enfin, la CreateSignature méthode 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 particulier, vous devez disposer des informations suivantes :

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

Pour vérifier une signature signée par la RSAPKCS1SignatureFormatter classe, utilisez la RSAPKCS1SignatureDeformatter classe. La RSAPKCS1SignatureDeformatter classe doit recevoir la clé publique du signataire. Pour RSA, vous aurez besoin, au minimum, des valeurs de RSAParameters.Modulus et RSAParameters.Exponent pour spécifier la clé publique. L’une des façons d’y parvenir consiste à appeler RSA.ExportParameters lors de la création de la signature, puis à appeler RSA.ImportParameters pendant le processus de vérification. La partie qui a généré la paire de clés publique/privée doit fournir ces valeurs. Commencez par créer un RSA objet pour contenir la clé publique qui vérifiera la signature, puis initialisez une RSAParameters structure sur les valeurs modulus et exposant qui spécifient la clé publique.

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

L’instance RSA est, à son tour, passée au constructeur d’un RSAPKCS1SignatureDeformatter pour transférer la clé.

L’exemple suivant illustre ce processus. Dans cet exemple, imaginez que sharedParameters, hashet signedHash sont fournis par un tiers distant. La partie distante a signé hash à l’aide de l’algorithme SHA256 pour produire la signature signedHashnumérique. La RSAPKCS1SignatureDeformatter.VerifySignature méthode vérifie que la signature numérique est valide et 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 ce n’est pas le cas.

Voir aussi