Generar claves para cifrado y descifrado

La creación y administración de claves es una parte importante del proceso criptográfico. Los algoritmos simétricos requieren la creación de una clave y un IV (Initialization Vector, vector de inicialización). Debe mantener esta clave en secreto para cualquier persona que no debería descifrar sus datos. El IV no tiene que ser secreto, pero debe cambiarse para cada sesión. Los algoritmos asimétricos requieren la creación de una clave pública y una clave privada. La clave pública puede ser conocida para cualquier persona, pero solo el usuario de descifrado debe conocer la clave privada correspondiente. En esta sección se describe cómo generar y administrar claves para algoritmos simétricos y asimétricos.

Claves simétricas

Las clases de cifrado simétricas proporcionadas por .NET requieren una clave y un nuevo IV para cifrar y descifrar datos. Al crear una nueva instancia de una de las clases criptográficas simétricas administradas mediante el método Create() sin parámetros, se crean automáticamente una clave y un vector de inicialización nuevos. Cualquier persona a la que permita descifrar sus datos debe poseer la misma clave y el mismo IV, y utilizar el mismo algoritmo. Por lo general, se debe crear una nueva clave e IV para cada sesión, y no se debe almacenar la clave ni el IV para su uso en una sesión posterior.

Para comunicar una clave simétrica y un IV a una entidad remota, normalmente se cifra la clave simétrica mediante el cifrado asimétrico. El envío de la clave a través de una red insegura sin cifrarla resulta peligroso, ya que quien intercepte la clave y el IV podrá descifrar los datos.

En el ejemplo siguiente se muestra la creación de una nueva instancia de la clase de implementación predeterminada para el algoritmo Aes :

Dim aes As Aes = Aes.Create()  
Aes aes = Aes.Create();  

La ejecución del código anterior genera una nueva clave y un IV y los establece como valores para las propiedades Key y IV, respectivamente.

En ocasiones tendrá que generar varias claves. En esta situación, puede crear una nueva instancia de una clase que implemente un algoritmo simétrico. A continuación, cree una nueva clave e IV llamando a los métodos GenerateKey y GenerateIV. En el ejemplo de código siguiente se muestra cómo crear nuevas claves e IV una vez creada una nueva instancia de la clase criptográfica simétrica:

Dim aes As Aes = Aes.Create()  
aes.GenerateIV()  
aes.GenerateKey()  
Aes aes = Aes.Create();  
aes.GenerateIV();  
aes.GenerateKey();  

La ejecución del código anterior crea una nueva instancia de Aes y genera una clave e IV. Se crea otra clave e IV cuando se llama a los métodos GenerateKey y GenerateIV.

Claves asimétricas

.NET proporciona la clase RSA para el cifrado asimétrico. Cuando se usa el método Create() sin parámetros para crear una nueva instancia, la clase RSA crea un par de claves pública y privada. Las claves asimétricas pueden almacenarse para utilizarse en sesiones múltiples o bien generarse para una sesión únicamente. Aunque puede hacer que la clave pública esté disponible, debe proteger estrechamente la clave privada.

Se genera un par de claves pública y privada al crear una nueva instancia de una clase de algoritmo asimétrico. Después de crear una nueva instancia de la clase , puede extraer la información de clave mediante el método ExportParameters . Este método devuelve una estructura RSAParameters que contiene la información clave. El método también acepta un valor booleano que indica si se debe devolver solo la información de clave pública o devolver tanto la clave pública como la información de clave privada.

También puede usar otros métodos para extraer la información clave, como:

Puede usar el método ImportParameters para inicializar una instancia de RSA en el valor de una estructura de RSAParameters . O bien, puede usar el método RSA.Create(RSAParameters) para crear una nueva instancia.

Nunca almacene claves privadas asimétricas textuales o como texto sin formato en el equipo local. Si necesita almacenar una clave privada, debe usar un contenedor de claves. Para obtener más información sobre cómo almacenar una clave privada en un contenedor de claves, vea Procedimiento para almacenar claves asimétricas en un contenedor de claves.

En el siguiente ejemplo de código se crea una nueva instancia de la clase RSA , se crea un par de claves pública y privada y se guarda la información de clave pública en una estructura de RSAParameters :

'Generate a public/private key pair.  
Dim rsa as RSA = RSA.Create()  
'Save the public key information to an RSAParameters structure.  
Dim rsaKeyInfo As RSAParameters = rsa.ExportParameters(false)  
//Generate a public/private key pair.  
RSA rsa = RSA.Create();  
//Save the public key information to an RSAParameters structure.  
RSAParameters rsaKeyInfo = rsa.ExportParameters(false);  

Consulte también