Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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
, hash
et signedHash
sont fournis par un tiers distant. La partie distante a signé hash
à l’aide de l’algorithme SHA256
pour produire la signature signedHash
numé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.