Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Kryptografische digitale Signaturen verwenden Öffentliche Schlüsselalgorithmen, um Datenintegrität bereitzustellen. Wenn Sie Daten mit einer digitalen Signatur signieren, kann eine andere Person die Signatur überprüfen und nachweisen, dass die Daten von Ihnen stammen und nach dem Signieren nicht geändert wurden. Weitere Informationen zu digitalen Signaturen finden Sie unter Kryptografiedienste.
In diesem Thema wird erläutert, wie Digitale Signaturen mithilfe von Klassen im System.Security.Cryptography Namespace generiert und überprüft werden.
Generieren einer Signatur
Digitale Signaturen werden in der Regel auf Hashwerte angewendet, die größere Daten darstellen. Im folgenden Beispiel wird eine digitale Signatur auf einen Hashwert angewendet. Zunächst wird eine neue Instanz der RSA Klasse erstellt, um ein öffentliches/privates Schlüsselpaar zu generieren. Als Nächstes wird die RSA Klasse an eine neue Instanz der RSAPKCS1SignatureFormatter Klasse übergeben. Dadurch wird der private Schlüssel an den RSAPKCS1SignatureFormatter übertragen, der tatsächlich die digitale Signatur durchführt. Bevor Sie den Hashcode signieren können, müssen Sie einen zu verwendenden Hashalgorithmus angeben. In diesem Beispiel wird der SHA256
Algorithmus verwendet. Schließlich wird die CreateSignature Methode aufgerufen, um die Signatur auszuführen.
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.
Überprüfen einer Signatur
Um zu überprüfen, ob Daten von einer bestimmten Partei signiert wurden, müssen Sie über die folgenden Informationen verfügen:
- Der öffentliche Schlüssel der Partei, die die Daten signiert hat.
- Die digitale Signatur.
- Die Daten, die signiert wurden.
- Der vom Signierer verwendete Hashalgorithmus.
Verwenden Sie die RSAPKCS1SignatureFormatter Klasse, um eine von der RSAPKCS1SignatureDeformatter Klasse signierte Signatur zu überprüfen. Die RSAPKCS1SignatureDeformatter Klasse muss den öffentlichen Schlüssel des Signierers angeben. Für RSA benötigen Sie mindestens die Werte von RSAParameters.Modulus und RSAParameters.Exponent, um den öffentlichen Schlüssel anzugeben. Eine Möglichkeit, dies zu erreichen, besteht darin, während der Signaturerstellung aufzurufen RSA.ExportParameters und dann während des Überprüfungsprozesses aufzurufen RSA.ImportParameters . Die Partei, die das Öffentliche/Private-Schlüsselpaar generiert hat, sollte diese Werte bereitstellen. Erstellen Sie zuerst ein RSA Objekt, das den öffentlichen Schlüssel enthält, der die Signatur überprüft, und initialisieren Sie dann eine RSAParameters Struktur mit den Modul- und Exponentenwerten, die den öffentlichen Schlüssel angeben.
Der folgende Code zeigt das Teilen einer RSAParameters Struktur. Die RSA
für die Erstellung der Signatur zuständige Datei exportiert ihre Parameter. Die Parameter werden dann in die neue RSA
Instanz importiert, die für die Überprüfung der Signatur verantwortlich ist.
Die RSA Instanz wird wiederum an den Konstruktor eines RSAPKCS1SignatureDeformatter Schlüssels übergeben, um den Schlüssel zu übertragen.
Das folgende Beispiel veranschaulicht diesen Prozess. Stellen Sie sich in diesem Beispiel vor, dass sharedParameters
, hash
und signedHash
von einer Remoteparty bereitgestellt werden. Der Remoteanbieter hat hash
mit dem SHA256
-Algorithmus signiert, um den signedHash
für die digitale Signatur zu erzeugen. Die RSAPKCS1SignatureDeformatter.VerifySignature Methode überprüft, ob die digitale Signatur gültig ist und zum Signieren hash
verwendet wurde.
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.");
}
}
Dieses Codefragment zeigt "The signature is valid
" an, wenn die Signatur gültig ist, und "The signature is not valid
" wenn dies nicht der Fall ist.