Freigeben über


Importieren des öffentlichen Treiberschlüssels

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde durch MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation ersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]

Der öffentliche RSA-Schlüssel des Treibers ist in den Tags Modulus und Exponent des Blattknotens des Zertifikats enthalten. Beide Werte sind base64-codiert und müssen decodiert werden. Wenn Sie die CryptoAPI von Microsoft verwenden, müssen Sie den Schlüssel in einen Kryptografiedienstanbieter (Cryptographic Service Provider, CSP) importieren, das das Modul ist, das die kryptografischen Algorithmen implementiert.

Um das Modul und die Exponenten von der Base64-Codierung in binäre Arrays zu konvertieren, verwenden Sie die CryptStringToBinary-Funktion , wie im folgenden Code gezeigt. Rufen Sie die Funktion einmal auf, um die Größe des Bytearrays abzurufen. Ordnen Sie dann den Puffer zu, und rufen Sie die Funktion erneut auf.

DWORD cbLen = 0, dwSkip = 0, dwFlags = 0;
::CryptStringToBinary(
   pszModulus,  // String that contains the Base64-encoded modulus.
   cchModulus,  // Length of the string, not including the trailing NULL.
   CRYPT_STRING_BASE64,  // Base64 encoding.
   NULL,     // Do not convert yet. Just calculate the length.
   &cbLen,   // Receives the length of the buffer that is required.
   &dwSkip,  // Receives the number of skipped characters.
   &dwFlags  // Receives flags.
);

// Allocate a new buffer.
BYTE *pbBuffer = new BYTE [cbLen];
::CryptStringToBinary(pszModulus, cchModulus, CRYPT_STRING_BASE64, 
    pbBuffer, &cbLen, &dwSkip, &dwFlags);

// (Repeat these steps for the exponent.)

Das base64-codierte Array befindet sich in big-endian-Reihenfolge, während die CryptoAPI die Zahl in Little-Endian-Reihenfolge erwartet. Daher müssen Sie die Bytereihenfolge des Arrays austauschen, das von CryptStringToBinary zurückgegeben wird. Der Modulus ist 256 Bytes, aber das decodierte Bytearray kann kleiner als 256 Bytes sein. Wenn ja, müssen Sie ein neues Array mit 256 Bytes zuordnen, die Daten in das neue Array kopieren und die Vorderseite des Arrays mit Nullen belegen. Der Exponent ist ein DWORD-Wert (4 Byte).

Nachdem Sie über die Werte modulus und exponent verfügen, können Sie den Schlüssel in den Standard-Kryptografiedienstanbieter (CSP) importieren, wie im folgenden Code gezeigt:

// Assume the following values exist:
BYTE *pModulus;     // Byte array that contains the modulus.
DWORD cbModulus;    // Size of the modulus in bytes.
DWORD dwExponent;   // Exponent.

// Create a new key container to hold the key. 
::CryptAcquireContext(
    &hCSP,         // Receives a handle to the CSP.
    NULL,          // Use the default key container.
    NULL,          // Use the default CSP.
    PROV_RSA_AES,  // Use the AES provider (public-key algorithm).
    CRYPT_SILENT | CRYPT_NEWKEYSET 
);

// Move the key into the key container. 
// The data format is: PUBLICKEYSTRUC + RSAPUBKEY + key
DWORD cbKeyBlob = cbModulus + sizeof(PUBLICKEYSTRUC) + sizeof(RSAPUBKEY)
BYTE *pBlob = new BYTE[cbKeyBlob];

// Fill in the data.
PUBLICKEYSTRUC *pPublicKey = (PUBLICKEYSTRUC*)pBlob;
pPublicKey->bType = PUBLICKEYBLOB; 
pPublicKey->bVersion = CUR_BLOB_VERSION;  // Always use this value.
pPublicKey->reserved = 0;                 // Must be zero.
pPublicKey->aiKeyAlg = CALG_RSA_KEYX;     // RSA public-key key exchange. 

// The next block of data is the RSAPUBKEY structure.
RSAPUBKEY *pRsaPubKey = (RSAPUBKEY*)(pBlob + sizeof(PUBLICKEYSTRUC));
pRsaPubKey->magic = RSA1;            // Public key.
pRsaPubKey->bitlen = cbModulus * 8;  // Number of bits in the modulus.
pRsaPubKey->pubexp = dwExponent;     // Exponent.

// Copy the modulus into the blob. Put the modulus directly after the
// RSAPUBKEY structure in the blob.
BYTE *pKey = (BYTE*)(pRsaPubkey + sizeof(RSAPUBKEY));
CopyMemory(pKey, pModulus, cbModulus);

// Now import the key.
HCRYPTKEY hRSAKey;  // Receives a handle to the key.
CryptImportKey(hCSP, pBlob, cbKeyBlob, 0, 0, &hRSAKey) 

Jetzt können Sie die CryptoAPI verwenden, um Befehle und status Anforderungen mit dem öffentlichen Schlüssel des Treibers zu verschlüsseln.

Verwenden des Certified Output Protection Protocol (COPP)