Freigeben über


Kryptografische Signaturen

Kryptografische digitale Signaturen verwenden Algorithmen mit öffentlichen Schlüsseln, um Datenintegrität bereitzustellen. Wenn Sie Daten mit einer digitalen Signatur signieren, kann die Signatur von einer anderen Person überprüft werden, die dann nachweisen kann, dass die Daten von Ihnen stammen und nach der Signierung nicht mehr geändert wurden. Weitere Informationen zu digitalen Signaturen finden Sie unter Kryptografische Dienste.

In diesem Thema wird erläutert, wie digitale Signaturen mithilfe von Klassen im System.Security.Cryptography-Namespace generiert und überprüft werden.

  • Generieren von Signaturen

  • Überprüfen von Signaturen

Generieren von Signaturen

Digitale Signaturen werden in der Regel auf Hashwerte angewendet, die eine größere Datenmenge darstellen. Im folgenden Beispiel wird eine digitale Signatur auf einen Hashwert angewendet. Zuerst wird eine neue Instanz der RSACryptoServiceProvider-Klasse erstellt, um ein öffentliches/privates Schlüsselpaar zu generieren. Anschließend wird der RSACryptoServiceProvider an eine neue Instanz der RSAPKCS1SignatureFormatter-Klasse übergeben. Dadurch wird der private Schlüssel an den RSAPKCS1SignatureFormatter übertragen, der letztlich die digitale Signatur vornimmt. Ehe der Hashcode signiert werden kann, müssen Sie den zu verwendenden Hashalgorithmus angeben. In diesem Beispiel wird der SHA1-Algorithmus verwendet. Abschließend wird die RSAPKCS1SignatureFormatter.CreateSignature-Methode aufgerufen, um die Signatur vorzunehmen.

Imports System
Imports System.Security.Cryptography

Module Module1
    Sub Main()
        'The hash value to sign.
        Dim HashValue As Byte() = {59, 4, 248, 102, 77, 97, 142, 201, 210, 12, 224, 93, 25, 41, 100, 197, 213, 134, 130, 135}

        'The value to hold the signed value.
        Dim SignedHashValue() As Byte

        'Generate a public/private key pair.
        Dim RSA As New RSACryptoServiceProvider()

        'Create an RSAPKCS1SignatureFormatter object and pass it 
        'the RSACryptoServiceProvider to transfer the private key.
        Dim RSAFormatter As New RSAPKCS1SignatureFormatter(RSA)

        'Set the hash algorithm to SHA1.
        RSAFormatter.SetHashAlgorithm("SHA1")

        'Create a signature for HashValue and assign it to 
        'SignedHashValue.
        SignedHashValue = RSAFormatter.CreateSignature(HashValue)
    End Sub
End Module

using System;
using System.Security.Cryptography;
class Class1
{
   static void Main()
   {
      //The hash value to sign.
      byte[] HashValue = {59,4,248,102,77,97,142,201,210,12,224,93,25,41,100,197,213,134,130,135};

      //The value to hold the signed value.
      byte[] SignedHashValue;

      //Generate a public/private key pair.
      RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

      //Create an RSAPKCS1SignatureFormatter object and pass it the 
      //RSACryptoServiceProvider to transfer the private key.
      RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(RSA);

      //Set the hash algorithm to SHA1.
      RSAFormatter.SetHashAlgorithm("SHA1");

      //Create a signature for HashValue and assign it to 
      //SignedHashValue.
      SignedHashValue = RSAFormatter.CreateSignature(HashValue);
   }
}

Signieren von XML-Dateien

.NET Framework stellt den System.Security.Cryptography.XML-Namespace bereit, der das Signieren von XML-Dateien ermöglicht. Das Signieren von XML-Dateien ist wichtig, wenn überprüft werden soll, ob eine XML-Datei von einer bestimmten Quelle stammt. Wenn Sie beispielsweise einen Aktienkursdienst beziehen, der XML verwendet, können Sie die Quelle der XML-Datei überprüfen, wenn diese signiert ist.

Die Klassen in diesem Namespace entsprechen den W3C-Empfehlungen für XML Signature Syntax and Processing.

Zurück nach oben

Überprüfen von Signaturen

Um zu überprüfen, ob Daten von einem bestimmten Teilnehmer signiert wurden, sind folgende Informationen erforderlich:

  • der öffentliche Schlüssel des Teilnehmers, der die Daten signiert hat.

  • die digitale Signatur.

  • die Daten, die signiert wurden.

  • der Hashalgorithmus, der vom Signaturgeber verwendet wurde.

Verwenden Sie die RSAPKCS1SignatureDeformatter-Klasse, um eine von der RSAPKCS1SignatureFormatter-Klasse signierte Signatur zu überprüfen. Der öffentliche Schlüssel des Signaturgebers muss für die RSAPKCS1SignatureDeformatter-Klasse bereitgestellt werden. Zum Definieren des öffentlichen Schlüssels sind die Modulooperator- und Exponentenwerte erforderlich. (Diese Werte müssen von dem Teilnehmer, der das öffentliche/private Schlüsselpaar generiert hat, bereitgestellt werden.) Zuerst wird ein RSACryptoServiceProvider-Objekt erstellt, das den öffentlichen Schlüssel enthält, mit dem die Signatur überprüft wird. Danach wird mit den Modulooperator- und Exponentenwerten, durch die der öffentliche Schlüssel definiert wird, eine RSAParameters-Struktur initialisiert.

Anhand des folgenden Codes wird die Erstellung einer RSAParameters-Struktur verdeutlicht. Für die Modulus-Eigenschaft wird der Bytearraywert ModulusData festgelegt, und für die Exponent-Eigenschaft wird der Bytearraywert ExponentData festgelegt.

Dim RSAKeyInfo As RSAParameters
RSAKeyInfo.Modulus = ModulusData
RSAKeyInfo.Exponent = ExponentData
RSAParameters RSAKeyInfo;
RSAKeyInfo.Modulus = ModulusData;
RSAKeyInfo.Exponent = ExponentData;

Nach dem Erstellen des RSAParameters-Objekts können Sie für die Werte in RSAParameters eine neue Instanz der RSACryptoServiceProvider-Klasse initialisieren. Der RSACryptoServiceProvider wird dann an den Konstruktor einer RSAPKCS1SignatureDeformatter-Klasse übergeben, um den Schlüssel zu übertragen.

Dieser Prozess wird anhand des folgenden Beispiels veranschaulicht. HashValue und SignedHashValue sind in diesem Beispiel Bytearrays, die von einer Gegenseite bereitgestellt wurden. Die Gegenseite hat den HashValue mit dem SHA1-Algorithmus signiert und erzeugt die digitale Signatur SignedHashValue. Mithilfe des

RSAPKCS1SignatureDeformatter.VerifySignature-Methode verifiziert die Gültigkeit der digitalen Signatur und überprüft, ob der HashValue damit signiert wurde.

Dim RSA As New RSACryptoServiceProvider()
RSA.ImportParameters(RSAKeyInfo)
Dim RSADeformatter As New RSAPKCS1SignatureDeformatter(RSA)
RSADeformatter.SetHashAlgorithm("SHA1")
If RSADeformatter.VerifySignature(HashValue, SignedHashValue) Then
   Console.WriteLine("The signature is valid.")
Else
   Console.WriteLine("The signture is not valid.")
End If
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
RSA.ImportParameters(RSAKeyInfo);
RSAPKCS1SignatureDeformatter RSADeformatter = new RSAPKCS1SignatureDeformatter(RSA);
RSADeformatter.SetHashAlgorithm("SHA1");
if(RSADeformatter.VerifySignature(HashValue, SignedHashValue))
{
   Console.WriteLine("The signature is valid.");
}
else
{
   Console.WriteLine("The signature is not valid.");
}

Wenn die Signatur gültig ist, wird durch dieses Codefragment die Meldung "The signature is valid" ausgegeben. Wenn die Signatur ungültig ist, wird die Meldung "The signature is not valid" angezeigt.

Zurück nach oben

Siehe auch

Konzepte

Kryptografische Dienste

Weitere Ressourcen

Kryptografische Aufgaben