Compartir a través de


Claves DSS

Generación y recuperación de claves DSS

Las claves DSS se pueden generar mediante una llamada a la función CryptGenKey . La llamada a CryptGenKey requiere que se pasen AT_SIGNATURE o CALG_DSS_SIGN en el argumento Algid . Esta llamada generará los valores P (módulo primo), Q (prime), G (generador), X (exponente secreto) e Y (clave pública) desde cero y los conservará en un BLOB de clave en el almacenamiento local.

Para generar un par de claves de firma de DSS

  1. Llame a la función CryptAcquireContext para obtener un identificador para el proveedor criptográfico de Microsoft DSS.
  2. Llame a CryptGenKey para generar las claves. Se deben pasar AT_SIGNATURE o CALG_DSS_SIGN para el argumento Algid y los 16 bits superiores del argumento dwFlags deben establecerse en el tamaño de clave deseado. Si los 16 bits superiores son cero, se usará el tamaño de clave predeterminado de 1024 bits. Se devuelve un identificador HCRYPTKEY en el argumento hKey .

Para recuperar un puntero a las claves de firma generadas anteriormente

  1. Llame a CryptAcquireContext para obtener un identificador para el proveedor criptográfico de Microsoft DSS.
  2. Llame a la función CryptGetUserKey con el argumento dwKeySpec establecido en AT_SIGNATURE o CALG_DSS_SIGN.

Para recuperar los valores P, Q y G

  1. Llame a CryptAcquireContext para obtener un identificador para el proveedor criptográfico de Microsoft DSS.
  2. Llame a CryptGetUserKey con el argumento dwKeySpec establecido en AT_SIGNATURE o CALG_DSS_SIGN.
  3. Llame a CryptGetKeyParam con el argumento hKey establecido en el puntero recuperado en el paso anterior. El argumento dwParam debe establecerse en la marca deseada; KP_P, KP_Q o KP_G. El valor se devuelve en el argumento pbData y la longitud de los datos se devuelve en el argumento pdwDataLen . El valor se devuelve sin información de encabezado ni en formato little-endian .

Generación de firmas de DSS

Los datos que se van a firmar primero deben aplicar un algoritmo hash mediante el algoritmo SHA . Después de aplicar un algoritmo hash a esos datos, se genera una firma DSS mediante una llamada a la función CryptSignHash .

Para generar una firma DSS

  1. Llame a CryptAcquireContext para obtener un identificador para el proveedor criptográfico de Microsoft DSS.
  2. Llame a CryptCreateHash con el argumento Algid establecido en CALG_SHA para obtener un identificador en un objeto hash SHA.
  3. Llame a CryptHashData con el argumento hHash establecido en el identificador recuperado en el paso anterior. Esto crea un hash de los datos y devuelve un identificador al hash en el argumento phHash de la llamada a la función CryptCreateHash .
  4. Llame a CryptSignHash con el argumento hHash establecido en el identificador recuperado en el paso anterior. Se pueden pasar AT_SIGNATURE o CALG_DSS_SIGN en el parámetro dwKeySpec . La firma se devuelve a la dirección proporcionada en el argumento pbSignature y la longitud de la firma se devuelve a la dirección proporcionada en el argumento pdwSigLen . Se puede pasar un puntero NULL en el argumento pbSignature y, en este caso, la firma no se genera, pero la longitud de la firma se devuelve a la dirección proporcionada en el parámetro pdwSigLen .

Comprobación de una firma DSS

Para comprobar una firma DSS, se debe importar la clave pública DSS del firmante, los datos firmados se deben aplicar un algoritmo hash y, a continuación, se puede comprobar la firma.

Para comprobar una firma DSS

  1. Llame a CryptAcquireContext para obtener un identificador para el proveedor criptográfico de Microsoft DSS.

  2. Llame a CryptImportKey para importar la clave pública de DSS del firmante.

  3. Llame a CryptCreateHash con el argumento Algid establecido en CALG_SHA para obtener un identificador en un objeto hash SHA.

  4. Llame a CryptHashData con el argumento hHash establecido en el identificador recuperado en el paso anterior y con pbData que apunte a los datos firmados. Esto crea un hash de los datos y devuelve un identificador al hash en el argumento phHash de la llamada a la función CryptCreateHash .

  5. Llame a CryptVerifySignature con la siguiente configuración:

    hHash se establece en el identificador del hash realizado en el paso anterior.

    pbSignature apunta a la firma que se va a comprobar.

    dwSigLen se establece en la longitud de la firma.

    hPubKey se establece en el identificador de la clave pública importada en el paso 2.

    dwFlags se establece en cero.

Exportación de claves DSS

Al enviar datos firmados a alguien en el que el destinatario deberá comprobar la firma, la clave pública del firmante debe proporcionarse al destinatario y normalmente se envía junto con los datos firmados. Por lo tanto, es necesario poder exportar las claves DSS en un formato BLOB de clave .

Para exportar la clave pública de DSS

  1. Llame a CryptAcquireContext para obtener un identificador para el proveedor criptográfico de Microsoft DSS.
  2. Llame a CryptGetUserKey con el argumento dwKeySpec establecido en AT_SIGNATURE o CALG_DSS_SIGN.
  3. Llame a CryptExportKey con hKey establecido en el identificador recuperado en el paso anterior, dwBlobType establecido en PUBLICKEYBLOB y dwFlags establecido en cero. El BLOB de clave pública de DSS se devuelve en pbData y la longitud del BLOB de clave se devuelve en pdwDataLen. Se puede pasar un puntero NULL en pbData y, en este caso, solo se devolverá la longitud del BLOB de clave DSS. El BLOB devuelto al realizar la llamada a CryptExportKey está en el formato descrito en blobs de clave de proveedor DSS.

Para exportar la clave privada de DSS

  • Siga el mismo procedimiento que para exportar una clave pública de DSS, excepto que al realizar la llamada a CryptExportKey, dwBlobType se establece en PRIVATEKEYBLOB. El BLOB devuelto al realizar la llamada a CryptExportKey está en el formato descrito en blobs de clave de proveedor DSS.