FUNCIÓN CIFRADO .NET
El Presente articulo explica como crear y utilizar una función genérica dentro de la Plataforma .NET para encriptar y desencriptar datos, en general cadena de caracteres; utilizando un algoritmo genérico que hace uso de los diferentes estándares de servicio de cifrado que proporciona el .NET Framework.
- DES (Digital Encryption Standard)
- Triple Des
- Rijndael
- RC2
Indice:
- Requerimientos
- Introducción
- Objetivo General
- Especificación del Algoritmo
- Demostración del Código
- Código Fuente
- Conclusión
- Fuentes
- Sistema Operativo Windows XP o Superior
- Sistema de Desarrollo Microsoft Visual Studio 2010
La Función descrita en este articulo, solo se requiere que tenga conocimiento de la herramienta de desarrollo Microsoft Visual Basic 2010
La criptografía impide la visión o modificación de los datos, y ofrece canales de comunicación seguros que de lo contrario resultarían inseguros. Por ejemplo, los datos pueden cifrarse usando un algoritmo criptográfico estandar, durante la transmisión de información en la red. Sí un tercero intercepta los datos cifrados, le resultará difícil descifrarlos.
Primitiva criptográfica
|
Uso
|
Cifrado de clave secreta (criptografía simétrica) | Realiza la transformación de los datos, impidiendo que terceros los lean. Este tipo de cifrado utiliza una clave secreta compartida para cifrar y descifrar los datos. |
Cifrado de clave pública (criptografía asimétrica) | Realiza la transformación de los datos, impidiendo que terceros los lean. Este tipo de cifrado utiliza un par de claves pública y privada para cifrar y descifrar los datos. |
Firmas criptográficas | Garantiza que los datos se originen en una parte específica mediante la creación de una firma digital única para esa parte. En este proceso también se usan funciones hash. |
Valores hash criptográficos | Asigna datos de cualquier longitud a una secuencia de bytes de longitud fija. Los valores hash son únicos estadísticamente; el valor hash de una secuencia de dos bytes distinta no será el mismo. |
Para el caso del algoritmo de nuestra Función Cifrado.NET, se utilizo la modalidad Cifrado de clave secreta (criptografía simétrica).
Los algoritmos de cifrado de clave secreta utilizan una clave secreta única para cifrar y descifrar datos. Debe asegurarse de que agentes no autorizados no obtengan acceso a la clave puesto que podrían utilizarla para descifrar los datos.
Normalmente, los algoritmos de clave secreta, denominados de cifrado de bloques, se utilizan para cifrar un bloque de datos a la vez. Los cifrados de bloques (como RC2, DES, TripleDES y Rijndael) transforman criptográficamente un bloque de entrada de n bytes en un bloque de salida de bytes cifrados. Si desea cifrar o descifrar una secuencia de bytes, debe hacerlo bloque a bloque. Como el tamaño de n es pequeño (n = 8 bytes para RC2, DES y TripleDES; n = 16, el valor predeterminado; n = 24; o n = 32 bytes para Rijndael), los valores mayores que n deben cifrarse en un bloque cada vez.
Las clases de cifrado de bloques que ofrece la biblioteca de clases base utilizan un modo de encadenamiento denominado CBC (Cipher Block Chaining, encadenamiento de bloques de cifrado), que utiliza una clave y un IV (Initialization Vector, vector de inicialización) para realizar transformaciones criptográficas en los datos.
.NET Framework proporciona las siguientes clases que implementan algoritmos de cifrado de clave secreta:
- DESCryptoServiceProvider
- RC2CryptoServiceProvider
- RijndaelManaged
- TripleDESCryptoServiceProvider
Para que el algoritmo funcione correctamente dentro de la Plataforma .NET; se necesita de lo siguiente: El uso de una Cadena de Caracteres de entrada de Datos, Key (Clave secreta) y IV (Initialization Vector), Cuya longitud debe variar de acuerdo con el servicio de cifrado que haya seleccionado dentro la función; por que de lo contrario se producirá una excepción.
Tabla de Longitudes de los Parametros
Clase
|
Soporte de Longitud Key (Clave Secreta)
|
Ejemplo
|
DES |
8 Byte |
|
Triple Des |
16 o 24 Byte |
|
Rijndael |
16 Byte |
|
RC2 |
16 Byte |
|
Para efecto de nuestro algoritmo; se debe utilizar las siguientes clase del Framework:
- System.Security.Cryptography (El espacio de nombres System.Security.Cryptography proporciona servicios de cifrado, entre los que se incluyen la codificación y descodificación segura de los datos y otras muchas operaciones como, por ejemplo, la técnica de dispersión o hashing, la generación de números aleatorios y la autenticación de mensajes).
- System.Text (El espacio de nombres System.Text contiene clases que representan codificaciones de caracteres ASCII, Unicode, UTF-7, y UTF-8; clases base abstractas para la conversión de bloques de caracteres en bloques de bytes y viceversa; y una clase auxiliar que manipula y da formato a objetos String sin necesidad de crear instancias intermedias de String).
- System.IO (El espacio de nombres System.IO contiene tipos que permiten leer y escribir en los archivos y secuencias de datos, así como tipos que proporcionan compatibilidad básica con los archivos y directorios. )
Clase
|
Descripción
|
System.Security.Cryptography |
|
System.Text |
|
System.IO |
|
Breve configuración de la función Cifrado:
- Modo:
- 1 es Encriptar;
- 2 es Desencriptar
- Algoritmo:
- 1 es DES
- 2 es TripleDES
- 3 es RC2
- 4 es Rijndael
- Cadena: Es la Cadena de Caracter a Cifrar.
- Key: Clave Secreta
- VecI: Vector de Inicialización
Imports System.Security.Cryptography
Imports System.Text
imports System.IO
Module Module1
Public Function Cifrado(ByVal modo As Byte, ByVal Algoritmo As Byte, ByVal cadena As String, ByVal key As String, ByVal VecI As String) As String
Dim plaintext() As Byte
If modo = 1 Then
plaintext = Encoding.ASCII.GetBytes(cadena)
ElseIf modo = 2 Then
plaintext = Convert.FromBase64String(cadena)
End If
Dim keys() As Byte = Encoding.ASCII.GetBytes(key)
Dim memdata As New MemoryStream
Dim transforma As ICryptoTransform
Select Case Algoritmo
Case 1
Dim des As New DESCryptoServiceProvider ‘ DES
des.Mode = CipherMode.CBC
If modo = 1 Then
transforma = des.CreateEncryptor(keys, Encoding.ASCII.GetBytes(VecI))
ElseIf modo = 2 Then
transforma = des.CreateDecryptor(keys, Encoding.ASCII.GetBytes(VecI))
End If
Case 2
Dim des3 As New TripleDESCryptoServiceProvider ‘TripleDES
des3.Mode = CipherMode.CBC
If modo = 1 Then
transforma = des3.CreateEncryptor(keys, Encoding.ASCII.GetBytes(VecI))
ElseIf modo = 2 Then
transforma = des3.CreateDecryptor(keys, Encoding.ASCII.GetBytes(VecI))
End If
Case 3
Dim rc2 As New RC2CryptoServiceProvider ‘RC2
rc2.Mode = CipherMode.CBC
If modo = 1 Then
transforma = rc2.CreateEncryptor(keys, Encoding.ASCII.GetBytes(VecI))
ElseIf modo = 2 Then
transforma = rc2.CreateDecryptor(keys, Encoding.ASCII.GetBytes(VecI))
End If
Case 4
Dim rj As New RijndaelManaged ‘Rijndael
rj.Mode = CipherMode.CBC
If modo = 1 Then
transforma = rj.CreateEncryptor(keys, Encoding.ASCII.GetBytes(VecI))
ElseIf modo = 2 Then
transforma = rj.CreateDecryptor(keys, Encoding.ASCII.GetBytes(VecI))
End If
End Select
Dim encstream As New CryptoStream(memdata, transforma, CryptoStreamMode.Write)
encstream.Write(plaintext, 0, plaintext.Length)
encstream.FlushFinalBlock()
encstream.Close()
If modo = 1 Then
cadena = Convert.ToBase64String(memdata.ToArray)
ElseIf modo = 2 Then
cadena = Encoding.ASCII.GetString(memdata.ToArray)
End If
Return cadena ‘Aquí Devuelve los Datos Cifrados
End Function
End Module
Cadena1 = Cifrado(1,1,»Usuario Demo»,»eeaataxz»,»eeaataxz») –> Aquí se Encripta
Cadena2 = Cifrado(2,1,Cadena1,»eeaataxz»,eeaataxz») –> Aquí se Desencripta
Cadena1 = «mR6A9ViW8f5BHtJgNEK78w==»
Cadena2 = «Usuario Demo»
- Cifrado-NET
- Cifrado-NET2 (Framework 3.5 y soporte de AES)
- Cifrado-NET2_CSharp (Framework 4.0, C#, Visual Studio 2012)
Conclusión: Con esta función se pretende obtener una mayor ventaja de las herramientas que proporciona el .NET framework, de una forma rápida y segura para aquellos que desean cifrar información con tan solo invocar una instrucción previamente configurada.