Freigeben über


Kryptografische Signaturen

Kryptografische digitale Signaturen verwenden Algorithmen für öffentliche Schlüssel, um die Datenintegrität sicherzustellen. Wenn Sie Daten mit einer digitalen Signatur signieren, kann eine andere Person die Signatur überprüfen und kann nachweisen, dass die Daten von Ihnen stammen und nicht geändert wurde, nachdem Sie sie signiert haben. Weitere Informationen zu digitalen Signaturen finden Sie unter Cryptographic Services.

In diesem Thema wird erläutert, wie Sie zum Generieren und Überprüfen von digitalen Signaturen Klassen im System.Security.Cryptography -Namespace verwenden.

Generieren einer Signatur

Digitale Signaturen werden in der Regel auf Hashwerte angewendet, die größere Datenmengen darstellen. Das folgende Beispiel wendet eine digitale Signatur auf einen Hashwert an. Zuerst wird eine neue Instanz der RSA -Klasse erstellt, um ein öffentliches/privates Schlüsselpaar zu generieren. Als Nächstes wird RSA ein eine neue Instanz der RSAPKCS1SignatureFormatter -Klasse übergeben. Dadurch wird der private Schlüssel an die RSAPKCS1SignatureFormatter-Klasse übertragen, die letztlich die digitale Signatur vornimmt. 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 das Signieren vorzunehmen.

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 sicherzustellen, dass Daten von einem bestimmten Anbieter signiert wurden, benötigen Sie die folgenden Informationen:

  • Der öffentliche Schlüssel des Anbieters, der die Daten signiert hat.
  • Die digitale XML-Signatur.
  • Die Daten, die signiert wurden.
  • Der vom Signaturgeber verwendete Hashalgorithmus.

Zum Überprüfen einer Signatur, die von der RSAPKCS1SignatureFormatter -Klasse signiert wurde, verwenden Sie die RSAPKCS1SignatureDeformatter -Klasse. Die RSAPKCS1SignatureDeformatter -Klasse muss dem öffentlichen Schlüssel des Signaturgebers bereitgestellt werden. 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 RSA.ExportParameters und dann während des Überprüfungsprozesses RSA.ImportParameters aufzurufen. Der Anbieter, der das Paar aus öffentlichem und privatem Schlüssel generiert hat, sollte diese Werte bereitstellen. Erstellen Sie zunächst ein RSA-Objekt für den öffentlichen Schlüssel, mit dem die Signatur überprüft wird, und initialisieren Sie dann eine RSAParameters-Struktur mit den Werten für „Modulus“ und „Exponent“, die den öffentlichen Schlüssel angeben.

Der folgende Code zeigt die gemeinsame Nutzung einer RSAParameters-Struktur. Das RSA-Element, das für die Erstellung der Signatur zuständig ist, exportiert seine 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 von RSAPKCS1SignatureDeformatter übergeben, um den Schlüssel zu übertragen.

Dieser Prozess wird anhand des folgenden Beispiels veranschaulicht. Stellen Sie sich in diesem Beispiel vor, dass sharedParameters, hash und signedHash von einem Remoteanbieter 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 von 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.

Siehe auch