Freigeben über


DSS-Schlüssel

Generieren und Abrufen von DSS-Schlüsseln

DSS Keys können durch einen Aufruf der CryptGenKey--Funktion generiert werden. Der Aufruf von CryptGenKey erfordert, dass entweder AT_SIGNATURE oder CALG_DSS_SIGN im Argument Algid übergeben werden. Dieser Aufruf generiert die Werte P (Prime Modulus), Q (prime), G (Generator), X (geheimer Exponenten) und Y (public key) von Grund auf neu und speichert sie in einem Schlüssel-BLOB- im lokalen Speicher.

So generieren Sie ein DSS-Signaturschlüsselpaar

  1. Rufen Sie die CryptAcquireContext--Funktion auf, um einen Handle für den Microsoft DSS-Kryptografieanbieter zu erhalten.
  2. Rufen Sie CryptGenKey- auf, um die Schlüssel zu generieren. Entweder AT_SIGNATURE oder CALG_DSS_SIGN müssen für das Argument Algid übergeben werden, und die oberen 16 Bits des arguments dwFlags müssen auf die gewünschte Schlüsselgröße festgelegt werden. Wenn die oberen 16 Bit null sind, wird die Standardschlüsselgröße von 1.024 Bit verwendet. Ein HCRYPTKEY- Handle wird im hKey--Argument zurückgegeben.

So rufen Sie einen Zeiger auf zuvor generierte Signaturschlüssel

  1. Rufen Sie CryptAcquireContext- auf, um einen Handle für den Microsoft DSS-Kryptografieanbieter zu erhalten.
  2. Rufen Sie die CryptGetUserKey--Funktion auf, wobei das argument dwKeyS pec auf AT_SIGNATURE oder CALG_DSS_SIGN festgelegt ist.

Abrufen der P-, Q- und G-Werte

  1. Rufen Sie CryptAcquireContext- auf, um einen Handle für den Microsoft DSS-Kryptografieanbieter zu erhalten.
  2. Rufen Sie CryptGetUserKey- auf, wobei das argument dwKeyS pec auf AT_SIGNATURE oder CALG_DSS_SIGN festgelegt ist.
  3. Rufen Sie CryptGetKeyParam- auf, wobei das argument hKey auf den im vorherigen Schritt abgerufenen Zeiger festgelegt ist. Das argument dwParam muss auf die gewünschte Kennzeichnung festgelegt werden; KP_P, KP_Q oder KP_G. Der Wert wird im argument pbData zurückgegeben, und die Länge der Daten wird im argument pdwDataLen zurückgegeben. Der Wert wird ohne Kopfzeileninformationen und im little-endian--Format zurückgegeben.

Generieren von DSS-Signaturen

Zu signierte Daten müssen zuerst hashed mithilfe des SHA- Algorithmus sein. Nachdem diese Daten hashed wurden, wird eine DSS- Signatur durch Aufrufen der CryptSignHash--Funktion generiert.

So generieren Sie eine DSS-Signatur

  1. Rufen Sie CryptAcquireContext- auf, um einen Handle für den Microsoft DSS-Kryptografieanbieter zu erhalten.
  2. Rufen Sie CryptCreateHash- auf, wobei das argument Algid auf CALG_SHA festgelegt ist, um ein Handle zu einem SHA-Hashobjekt abzurufen.
  3. Rufen Sie CryptHashData- auf, wobei das argument hHash auf das handle festgelegt ist, das im vorherigen Schritt abgerufen wurde. Dadurch wird ein Hash der Daten erstellt und ein Handle an den Hash im phHash Argument des CryptCreateHash Funktionsaufrufs zurückgegeben.
  4. Rufen Sie CryptSignHash- auf, wobei das argument hHash auf das handle festgelegt ist, das im vorherigen Schritt abgerufen wurde. Entweder AT_SIGNATURE oder CALG_DSS_SIGN können im dwKeySpec Parameter übergeben werden. Die Signatur wird an die adresse zurückgegeben, die im argument pbSignature angegeben wird, und die Länge der Signatur wird an die Adresse zurückgegeben, die im pdwSigLen Argument angegeben ist. Ein NULL- Zeiger kann im argument pbSignature übergeben werden, und in diesem Fall wird die Signatur nicht generiert, aber die Länge der Signatur wird an die adresse zurückgegeben, die im pdwSigLen Parameter angegeben ist.

Überprüfen einer DSS-Signatur

Um eine DSS-Signatur zu überprüfen, muss der öffentliche DSS-Schlüssel des Signierers importiert werden, die signierten Daten hashed werden müssen, und dann kann die Signatur überprüft werden.

So überprüfen Sie eine DSS-Signatur

  1. Rufen Sie CryptAcquireContext- auf, um einen Handle für den Microsoft DSS-Kryptografieanbieter zu erhalten.

  2. Rufen Sie CryptImportKey- auf, um den öffentlichen DSS-Schlüssel des Signierers zu importieren.

  3. Rufen Sie CryptCreateHash- auf, wobei das argument Algid auf CALG_SHA festgelegt ist, um ein Handle zu einem SHA-Hashobjekt abzurufen.

  4. Rufen Sie CryptHashData- auf, wobei das hHash Argument auf das handle festgelegt ist, das im vorherigen Schritt abgerufen wurde, und mit pbData-, die auf die signierten Daten zeigen. Dadurch wird ein Hash der Daten erstellt und ein Handle an den Hash im phHash Argument des CryptCreateHash Funktionsaufrufs zurückgegeben.

  5. Rufen Sie CryptVerifySignature mit den folgenden Einstellungen auf:

    hHash- auf das Handle festgelegt ist, das im vorherigen Schritt ausgeführt wurde.

    pbSignature verweist auf die zu überprüfende Signatur.

    dwSigLen wird auf die Länge der Signatur festgelegt.

    hPubKey- auf das Handle des öffentlichen Schlüssels festgelegt ist, der in Schritt 2 importiert wird.

    dwFlags- ist auf Null festgelegt.

Exportieren von DSS-Schlüsseln

Wenn Sie signierten Daten an eine Person senden, an die die Signatur vom Empfänger überprüft werden muss, muss der öffentliche Schlüssel des Signierers an den Empfänger übermittelt und in der Regel zusammen mit den signierten Daten gesendet werden. Daher ist es erforderlich, die DSS- Schlüssel in einem BLOB--Format zu exportieren.

Exportieren des öffentlichen DSS-Schlüssels

  1. Rufen Sie CryptAcquireContext- auf, um einen Handle für den Microsoft DSS-Kryptografieanbieter zu erhalten.
  2. Rufen Sie CryptGetUserKey- auf, wobei das argument dwKeyS pec auf AT_SIGNATURE oder CALG_DSS_SIGN festgelegt ist.
  3. Rufen Sie CryptExportKey- auf, wobei hKey- auf das im vorherigen Schritt abgerufene Handle festgelegt ist, dwBlobType auf PUBLICKEYBLOB festgelegt und dwFlags auf Null festgelegt. Die DSS-BLOB- für öffentliche Schlüssel wird in pbData-zurückgegeben, und die Länge des Schlüssel-BLOB- wird in pdwDataLen-zurückgegeben. Ein NULL- Zeiger kann in pbData-übergeben werden, und in diesem Fall wird nur die Länge des DSS-Schlüssel-BLOB zurückgegeben. Das BLOB, das beim Aufruf von CryptExportKey- zurückgegeben wird, befindet sich im format, das in DSS Provider Key BLOBsbeschrieben wird.

So exportieren Sie den privaten DSS-Schlüssel

  • Befolgen Sie das gleiche Verfahren wie beim Exportieren eines öffentlichen DSS-Schlüssels, außer dass beim Aufruf von CryptExportKeydwBlobType- auf PRIVATEKEYBLOB festgelegt ist. Das BLOB, das beim Aufruf von CryptExportKey- zurückgegeben wird, befindet sich im format, das in DSS Provider Key BLOBsbeschrieben wird.