Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se muestra cómo usar funciones de derivación de claves estándar para derivar claves y cómo cifrar el contenido mediante claves simétricas y asimétricas.
Claves simétricas
El cifrado de claves simétricas, también denominado cifrado de clave secreta, requiere que la clave usada para el cifrado también se use para el descifrado. Puede usar una clase SymmetricKeyAlgorithmProvider para especificar un algoritmo simétrico y crear o importar una clave. Puede usar métodos estáticos en la clase CryptographicEngine para cifrar y descifrar datos mediante el algoritmo y la clave.
El cifrado de claves simétricas normalmente usa cifrados de bloques y modos de cifrado de bloques. Un cifrado de bloques es una función de cifrado simétrica que funciona en bloques de tamaño fijo. Si el mensaje que desea cifrar es mayor que la longitud del bloque, debe usar un modo de cifrado de bloques. Un modo de cifrado de bloques es una función de cifrado simétrica creada mediante un cifrado de bloques. Encripta texto sin formato como una serie de bloques de tamaño fijo. Se admiten los siguientes modos para las aplicaciones:
- El modo ECB (código electrónico) cifra cada bloque del mensaje por separado. Esto no se considera un modo de cifrado seguro.
- El modo CBC (encadenamiento de bloques de cifrado) usa el bloque de texto cifrado anterior para ofuscar el bloque actual. Debe determinar qué valor se va a usar para el primer bloque. Este valor se denomina vector de inicialización (IV).
- El modo CCM (contador con CBC-MAC) combina el modo de cifrado de bloques CBC con un código de autenticación de mensajes (MAC).
- El modo GCM (modo contador Galois) combina el modo de cifrado de contador con el modo de autenticación de Galois.
Algunos modos como CBC requieren que use un vector de inicialización (IV) para el primer bloque de texto cifrado. A continuación se muestran vectores de inicialización comunes. Especifique el IV al llamar a CryptographicEngine.Encrypt. Para la mayoría de los casos, es importante que el IV nunca se reutilice con la misma clave.
- Usa el mismo IV fijo para cifrar todos los mensajes. Esto filtra información y no se recomienda su uso.
- Contador incrementa el IV para cada bloque.
- Random crea un IV pseudoaleatorio. Puede usar CryptographicBuffer.GenerateRandom para crear el IV.
- Nonce-Generated usa un número único para cada mensaje que se va a cifrar. Normalmente, el nonce es un mensaje modificado o identificador de transacción. El nonce no tiene que mantenerse en secreto, pero nunca debe reutilizarse bajo la misma clave.
La mayoría de los modos requieren que la longitud del texto no cifrado sea un múltiplo exacto del tamaño del bloque. Esto normalmente requiere que se rellene el texto sin formato para obtener la longitud adecuada.
Aunque los cifrados de bloques cifran bloques de tamaño fijo de datos, los cifrados de flujo son funciones de cifrado simétricas que combinan bits de texto no cifrado con una secuencia de bits pseudoaleatoria (denominada secuencia de claves) para generar el texto cifrado. Algunos modos de cifrado de bloques, como el modo de comentarios de salida (OTF) y el modo de contador (CTR) convierten eficazmente un cifrado de bloque en un cifrado de flujo. Sin embargo, los cifrados de flujo reales, como RC4, normalmente funcionan a velocidades más altas que los modos de cifrado de bloques son capaces de lograr.
En el ejemplo siguiente se muestra cómo usar la clase SymmetricKeyAlgorithmProvider para crear una clave simétrica y usarla para cifrar y descifrar datos.
Claves asimétricas
La criptografía de clave asimétrica, también denominada criptografía de clave pública, usa una clave pública y una clave privada para realizar el cifrado y el descifrado. Las claves son diferentes, pero están relacionadas matemáticamente. Normalmente, la clave privada se mantiene secreta y se usa para descifrar los datos mientras la clave pública se distribuye a las partes interesadas y se usa para cifrar los datos. La criptografía asimétrica también es útil para firmar datos.
Dado que la criptografía asimétrica es mucho más lenta que la criptografía simétrica, rara vez se usa para cifrar grandes cantidades de datos directamente. En su lugar, normalmente se usa de la siguiente manera para cifrar las claves.
- Alice requiere que Bob envíe sus únicos mensajes cifrados.
- Alice crea un par de claves privadas o públicas, mantiene su secreto de clave privada y publica su clave pública.
- Bob tiene un mensaje que quiere enviar a Alice.
- Bob crea una clave simétrica.
- Bob usa su nueva clave simétrica para cifrar su mensaje a Alice.
- Bob usa la clave pública de Alice para cifrar su clave simétrica.
- Bob envía el mensaje cifrado y la clave simétrica cifrada a Alice (envuelto).
- Alice usa su clave privada (del par privado o público) para descifrar la clave simétrica de Bob.
- Alice usa la clave simétrica de Bob para descifrar el mensaje.
Puede usar un objeto AsymmetricKeyAlgorithmProvider para especificar un algoritmo asimétrico o un algoritmo de firma, para crear o importar un par de claves efímeros, o para importar la parte de clave pública de un par de claves.
Derivación de claves
A menudo es necesario derivar claves adicionales de un secreto compartido. Puede usar la clase KeyDerivationAlgorithmProvider y uno de los métodos especializados siguientes en la clase KeyDerivationParameters para derivar claves.
| Objeto | Descripción |
|---|---|
| BuildForPbkdf2 | Crea un objeto KeyDerivationParameters para su uso en la función de derivación de claves basada en contraseña 2 (PBKDF2). |
| BuildForSP800108 | Crea un objeto KeyDerivationParameters para su uso en un modo contador, utilizando una función de derivación de clave HMAC (código de autenticación de mensajes basado en hash). |
| BuildForSP80056a | Crea un objeto KeyDerivationParameters para su uso en la función de derivación de claves SP800-56A. |