DSS-Schlüssel
- Generieren und Abrufen von DSS-Schlüsseln
- Generieren von DSS-Signaturen
- Überprüfen einer DSS-Signatur
- Exportieren von DSS-Schlüsseln
Generieren und Abrufen von DSS-Schlüsseln
DSS-Schlüssel können durch einen Aufruf der CryptGenKey-Funktion generiert werden. Der Aufruf von CryptGenKey erfordert, dass entweder AT_SIGNATURE oder CALG_DSS_SIGN im Algid-Argument übergeben werden. Dieser Aufruf generiert die Werte P (Prime-Modulus), Q (Prime), G (Generator), X (Geheimnis-Exponent) und Y (öffentlicher Schlüssel) von Grund auf und speichert sie in einem Schlüsselblob im lokalen Speicher.
So generieren Sie ein DSS-Signaturschlüsselpaar
- Rufen Sie die CryptAcquireContext-Funktion auf, um ein Handle für den Microsoft DSS-Kryptografieanbieter abzurufen.
- Rufen Sie CryptGenKey auf, um die Schlüssel zu generieren. Entweder AT_SIGNATURE oder CALG_DSS_SIGN muss für das Algid-Argument übergeben werden, und die oberen 16 Bits des dwFlags-Arguments müssen auf die gewünschte Schlüsselgröße festgelegt werden. Wenn die oberen 16 Bits 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 ab
- Rufen Sie CryptAcquireContext auf, um ein Handle für den Microsoft DSS-Kryptografieanbieter zu erhalten.
- Rufen Sie die CryptGetUserKey-Funktion auf, wobei das argument dwKeySpec entweder auf AT_SIGNATURE oder CALG_DSS_SIGN festgelegt ist.
So rufen Sie die P-, Q- und G-Werte ab
- Rufen Sie CryptAcquireContext auf, um ein Handle für den Microsoft DSS-Kryptografieanbieter zu erhalten.
- Rufen Sie CryptGetUserKey auf, wobei das Argument dwKeySpec entweder auf AT_SIGNATURE oder CALG_DSS_SIGN festgelegt ist.
- Rufen Sie CryptGetKeyParam auf, wobei das Argument hKey auf den im vorherigen Schritt abgerufenen Zeiger festgelegt ist. Das argument dwParam muss auf das gewünschte Flag 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 Headerinformationen und im Little-Endian-Format zurückgegeben.
Generieren von DSS-Signaturen
Zu signierte Daten müssen zuerst mithilfe des SHA-Algorithmus gehasht werden. Nachdem diese Daten gehasht wurden, wird eine DSS-Signatur generiert, indem die CryptSignHash-Funktion aufgerufen wird.
So generieren Sie eine DSS-Signatur
- Rufen Sie CryptAcquireContext auf, um ein Handle für den Microsoft DSS-Kryptografieanbieter zu erhalten.
- Rufen Sie CryptCreateHash auf, wobei das Algid-Argument auf CALG_SHA festgelegt ist, um ein Handle für ein SHA-Hashobjekt abzurufen.
- Rufen Sie CryptHashData auf, wobei das Argument hHash auf das im vorherigen Schritt abgerufene Handle festgelegt ist. Dadurch wird ein Hash der Daten erstellt und ein Handle für den Hash im phHash-Argument des Funktionsaufrufs CryptCreateHash zurückgegeben.
- Rufen Sie CryptSignHash auf, wobei das Argument hHash auf das im vorherigen Schritt abgerufene Handle festgelegt ist. Im dwKeySpec-Parameter können AT_SIGNATURE oder CALG_DSS_SIGN übergeben werden. Die Signatur wird an die adresse zurückgegeben, die im argument pbSignature angegeben ist, und die Länge der Signatur wird an die adresse zurückgegeben, die im argument pdwSigLen 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 müssen gehasht werden, und dann kann die Signatur überprüft werden.
So überprüfen Sie eine DSS-Signatur
Rufen Sie CryptAcquireContext auf, um ein Handle für den Microsoft DSS-Kryptografieanbieter zu erhalten.
Rufen Sie CryptImportKey auf, um den öffentlichen DSS-Schlüssel des Signierers zu importieren.
Rufen Sie CryptCreateHash auf, wobei das Algid-Argument auf CALG_SHA festgelegt ist, um ein Handle für ein SHA-Hashobjekt abzurufen.
Rufen Sie CryptHashData auf, wobei das Argument hHash auf das im vorherigen Schritt abgerufene Handle festgelegt ist und pbData auf die signierten Daten verweist. Dadurch wird ein Hash der Daten erstellt und ein Handle für den Hash im phHash-Argument des Funktionsaufrufs CryptCreateHash zurückgegeben.
Rufen Sie CryptVerifySignature mit den folgenden Einstellungen auf:
hHash wird auf das Handle für den Hash festgelegt, der im vorherigen Schritt ausgeführt wurde.
pbSignature verweist auf die zu überprüfende Signatur.
dwSigLen ist auf die Länge der Signatur festgelegt.
hPubKey ist auf das Handle des öffentlichen Schlüssels festgelegt, der in Schritt 2 importiert wurde.
dwFlags ist auf 0 (null) festgelegt.
Exportieren von DSS-Schlüsseln
Wenn Sie signierte Daten an eine Person senden, bei der die Signatur vom Empfänger überprüft werden muss, muss der öffentliche Schlüssel des Unterzeichners an den Empfänger bereitgestellt werden und wird in der Regel zusammen mit den signierten Daten gesendet. Daher ist es notwendig, die DSS-Schlüssel in einem Schlüsselblobformat exportieren zu können.
So exportieren Sie den öffentlichen DSS-Schlüssel
- Rufen Sie CryptAcquireContext auf, um ein Handle für den Microsoft DSS-Kryptografieanbieter zu erhalten.
- Rufen Sie CryptGetUserKey auf, wobei das Argument dwKeySpec entweder auf AT_SIGNATURE oder CALG_DSS_SIGN festgelegt ist.
- Rufen Sie CryptExportKey auf, wobei hKey auf das im vorherigen Schritt abgerufene Handle festgelegt ist, dwBlobType auf PUBLICKEYBLOB und dwFlags auf Null festgelegt ist. Das DSS-BLOB mit öffentlichem Schlüssel wird in pbData zurückgegeben, und die Länge des Schlüsselblobs 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üsselblobs zurückgegeben. Das BLOB, das beim Aufruf von CryptExportKey zurückgegeben wird, hat das unter DSS-Anbieterschlüssel-BLOBs beschriebene Format.
So exportieren Sie den privaten DSS-Schlüssel
- Befolgen Sie das gleiche Verfahren wie beim Exportieren eines öffentlichen DSS-Schlüssels, mit der Ausnahme, dass dwBlobType beim Aufruf von CryptExportKey auf PRIVATEKEYBLOB festgelegt ist. Das BLOB, das beim Aufruf von CryptExportKey zurückgegeben wird, hat das unter DSS-Anbieterschlüssel-BLOBs beschriebene Format.