TripleDES - Un ejemplo practico en C#

En Devjoker hemos publicado ya algunos articulos sobre encriptación, desde como implementar un sencillo algoritmo propio con aritmetica modular (http://www.devjoker.com/contenidos/Articulos/2/Una-clase-sencilla-para-encriptar-cadenas.aspx) hasta los estupendos articulos de Pablo Gumpert sobre como utilizar el algoritmo TRIPLEDES:

También de Pablo Gumpert es el articulo sobre encriptación en SQL Server:

Este articulo pretende, por un lado servir de recopilación de enlaces de criptografia de devjoker, y por otro mostrar un ejemplo practico de como implementar la encriptación a través del algoritmo TRIPLEDES.

En este ejemplo vamos a escribir una clase, en C# que encripta un texto introducido por el usuario y posteriormente lo desencripta. La utilidad del programa radica en mostrar como se encriptan los datos y como posteriormente se recuperan.

Lo primero que hacemos es definir una clase, a la que llamamos TripleDESUtil, y definimos dos propiedades, IV y Key. Estas propiedades son de extrema importancia, ya que sin ellas no podrémos descifrar nada. Es importante que en un sistema real estas propiedades sean persistentes o se lean de algún lugar seguro.

 

class TripleDESUtil

{

public byte[] IV { get; set; }

 

public byte[] Key { get; set; }

}

El ejemplo lo he realizado con el framework 3.5, por lo que hemos declarado las propiedades de forma abreviada. Si trabajais con un framework anterior tendreis que implementar las propiedades manualmente.

A continuación, escribirmos el metodo de encriptación. Utilizamos las clases que nos proporciona el .NET framework para utilizar el algoritmo TRIPLEDES. Estan definidas en el namespace System.Security.Cryptography y son:

  • TripleDESCryptoServiceProvider, que permite crear un objeto que implemente la interfaz ICryptoTransform y encardo de manejar la clave(key) y el desplazamiento(IV).
  • ICryptoTransform, que define las operaciones básicas de las transformaciones criptográficas.
  • CryptoStream, Stream donde escribiremos el resultado de la encriptación.

 

public byte[] Encriptar( string cadenaOrigen)

{

UTF8Encoding encoding = new UTF8Encoding();

byte[] message = encoding.GetBytes(cadenaOrigen);

 

TripleDESCryptoServiceProvider criptoProvider =

new TripleDESCryptoServiceProvider();

IV = criptoProvider.IV;

Key = criptoProvider.Key;

 

ICryptoTransform criptoTransform =

criptoProvider.CreateEncryptor(Key, IV);

 

MemoryStream memoryStream = new MemoryStream();

 

CryptoStream cryptoStream =

new CryptoStream(memoryStream,

criptoTransform,

CryptoStreamMode.Write);

 

cryptoStream.Write(message, 0, message.Length);

// cryptoStream.Flush();

cryptoStream.FlushFinalBlock();

 

byte[] encriptado = memoryStream.ToArray();

 

string cadenaEncriptada = encoding.GetString(encriptado);

Console.WriteLine("Texto encriptado {0}", cadenaEncriptada );

 

return encriptado;

}

El metodo muestra en pantalla el resultado de la encriptación, por supuesto esta parte la eliminariamos en una implementación real.

La función para desencriptar es muy similar, salvo que al crear la transformación ICryptoTransform utilizamos el método CreateDecryptor y que al instanciar el CryptoStream le indicamos que el método es de lectura, a través de la enumeración CryptoStreamMode.Read. Posteriormente utilizamos un StreamReader para obtener el texto descifrado.

 

public string DesEncriptar(byte[] message)

{

TripleDES cryptoProvider =

new TripleDESCryptoServiceProvider();

 

ICryptoTransform cryptoTransform =

cryptoProvider.CreateDecryptor(Key,IV );

 

MemoryStream memoryStream = new MemoryStream(message);

 

CryptoStream cryptoStream =

new CryptoStream(memoryStream,

cryptoTransform,

CryptoStreamMode.Read);

 

StreamReader sr = new StreamReader(cryptoStream,true);

 

string textoLimpio = sr.ReadToEnd();

Console.WriteLine("Texto Limpio:{0}", textoLimpio);

return textoLimpio;

}

Por último el método Main del programa:

 

class Program

{

static void Main(string[] args)

{

Console.WriteLine("Introduce el texto a encriptar:");

string message = Console.ReadLine();

TripleDESUtil crypto = new TripleDESUtil();

byte[] cifrado = crypto.Encriptar( message);

string texto = crypto.DesEncriptar(cifrado);

Console.ReadLine();

}

}

Es importante observar que es la misma instancia de la clase TripleDESUtil quien encripta y desencripta, esto es muy importante, ya que de este modo se reutilizan las claves, definidas en las propiedades Key y IV al principio. Sin estas claves no podremos desencriptar.

A continuación mostramos el código completo del ejemplo para que no queden dudas.

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Security.Cryptography;

using System.IO;

 

namespace TripleDESEncriptor

{

class Program

{

static void Main(string[] args)

{

Console.WriteLine("Introduce el texto a encriptar:");

string message = Console.ReadLine();

TripleDESUtil crypto = new TripleDESUtil();

byte[] cifrado = crypto.Encriptar( message);

string texto = crypto.DesEncriptar(cifrado);

Console.ReadLine();

}

}

 

class TripleDESUtil

{

public byte[] IV { get; set; }

 

public byte[] Key { get; set; }

 

public string DesEncriptar(byte[] message)

{

TripleDES cryptoProvider =

new TripleDESCryptoServiceProvider();

 

ICryptoTransform cryptoTransform =

cryptoProvider.CreateDecryptor(Key,IV );

 

MemoryStream memoryStream = new MemoryStream(message);

 

CryptoStream cryptoStream =

new CryptoStream(memoryStream,

cryptoTransform,

CryptoStreamMode.Read);

 

StreamReader sr =

new StreamReader(cryptoStream,true);

 

string textoLimpio = sr.ReadToEnd();

Console.WriteLine("Texto Limpio:{0}", textoLimpio);

return textoLimpio;

}

 

public byte[] Encriptar( string cadenaOrigen)

{

UTF8Encoding encoding = new UTF8Encoding();

byte[] message = encoding.GetBytes(cadenaOrigen);

 

TripleDESCryptoServiceProvider criptoProvider =

new TripleDESCryptoServiceProvider();

 

IV = criptoProvider.IV;

Key = criptoProvider.Key;

 

ICryptoTransform criptoTransform =

criptoProvider.CreateEncryptor(Key, IV);

 

MemoryStream memoryStream = new MemoryStream();

 

CryptoStream cryptoStream =

new CryptoStream(memoryStream,

criptoTransform,

CryptoStreamMode.Write);

 

cryptoStream.Write(message, 0, message.Length);

// cryptoStream.Flush();

cryptoStream.FlushFinalBlock();

 

byte[] encriptado = memoryStream.ToArray();

string cadenaEncriptada = encoding.GetString(encriptado);

Console.WriteLine("Texto encriptado:{0}",cadenaEncriptada);

Console.WriteLine();

 

return encriptado;

}

}

}

Por último recordar un enlace con un ejemplo para encriptar utilizando el algoritmo AES:

 Saludos, DJK

Pedro  Herrarte  Sánchez
TripleDES - Un ejemplo practico en C#
Pedro Herrarte Sánchez

Pedro Herrarte, es consultor independiente, ofreciendo servicios de consultoría, análisis, desarrollo y formación. Posee mas de diez años de experiencia trabajando para las principales empresas de España. Es especialista en tecnologías .NET, entornos Web (ASP.NET, ASP.NET MVC,jQuery, HTML5), bases de datos (SQL Server y ORACLE) e integración de sistemas. Es experto en desarrollo (C#, VB.Net, T-SQL, PL/SQL, , ASP, CGI , C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...) y bases de datos (SQL Server y ORACLE). Pedro es MCP y MAP 2012, es fundador, diseñador y programador de www.devjoker.com..
Fecha de alta:17/12/2009
Última actualizacion:17/12/2009
Visitas totales:49841
Valorar el contenido:
Últimas consultas realizadas en los foros
Últimas preguntas sin contestar en los foros de devjoker.com