Blog de Jorge Pedraza

enero 29, 2011

Funcion Cifrado .NET

Filed under: Seguridad — JorgePedraza @ 10:50 am
Tags: , , , ,

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:

  • 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

Introducción:

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

Objetivo General :

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

  • Key = «Password»
  • IV = «Password»

Triple Des

16 o 24 Byte

  • Key = «password12345678»
  • IV = «password12345678»

Rijndael

16 Byte

  • Key = «1234567891234567»
  • IV = «1234567891234567»

RC2

16 Byte

  • Key = «1234567891234567»
  • IV = «1234567891234567»

Especificación del Algoritmo:

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
  • ICryptoTransform: Define las operaciones básicas de las transformaciones criptográficas.
  • CryptoStream: Especifica el modo de una secuencia criptográfica
System.Text
  • Encoding:Representa una codificación de carácter.
System.IO
  • MemoryStream:Crea una secuencia cuyo almacén de respaldo es la memoria.

Demostración del Código:

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


screenshotCDCS

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»


Código Fuente:

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.

Fuentes:

enero 2, 2011

Los números de 2010

Filed under: Uncategorized — JorgePedraza @ 7:32 am

Los duendes de estadísticas de WordPress.com han analizado el desempeño de este blog en 2010 y te presentan un resumen de alto nivel de la salud de tu blog:

Healthy blog!

El Blog-Health-o-Meter™ indica: Wow.

Números crujientes

Imagen destacada

Alrededor de 3 millones de personas visitan el Taj Mahal cada año. Este blog fue visto cerca de 27,000 veces en 2010. Si el blog fuera el Taj Mahal, se necesitarían alrededor de 3 días para visitarlo.

En 2010, publicaste 13 entradas nueva, haciendo crecer el arquivo para 25 entradas. Subiste 244 imágenes, ocupando un total de 2mb. Eso son alrededor de 5 imágenes por semana.

Tu día más ocupado del año fue el 4 de febrero con 402 visitas. La entrada más popular de ese día fue Servicios Web.

¿De dónde vienen?

Los sitios de referencia más populares en 2010 fueran social.msdn.microsoft.com, facebook.com, mail.live.com, blogs.msdn.com y google.es.

Algunos visitantes buscan tu blog, sobre todo por aplicaciones windows mobile 6.5, windows mobile 6.5 aplicaciones, aplicaciones para windows mobile 6.5, plantillas y windows mobile 6.5 professional.

Lugares de interés en 2010

Estas son las entradas y páginas con más visitas en 2010.

1

Servicios Web enero, 2010
3 comentários

2

Windows Mobile 6.5 – Aplicaciones móviles de próxima generación julio, 2009
8 comentários

3

Convertir pagina HTML a ASP.NET julio, 2009
7 comentários

4

Exportar DataTable a Excel desde ASP.NET enero, 2010
4 comentários

5

Implementación de Aplicaciones Web con Visual Studio 2010 enero, 2010

Blog de WordPress.com.