InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
También puedes ver ...
LinQ To SQL - Un ejemplo sencillo
Cómo activar Intelisense (autocompletado) en el Web.config
Leer un campo XML de SQL Server 2005 con C#
Mostrar un GridView dentro de un DataList
String.Format
Métodos Extensores: INNER JOIN
Problemas al conectar a redes wifi con Windows Vista
Problemas en la instalación de Visual Studio 2008-Visual studio web authoring component
¿Quieres saber quién te tiene no admitido/eliminado en el MSN? Pues no des tu contraseña a desconocidos
Redimiento de VS2008

Afiliados
La Web del programador
MundoProgramacion


 
 Versión para imprimir

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;

}

}

}

 Saludos, DJK


 Versión para imprimir  Foros de consulta


Añadir comentario ... Para preguntar utiliza los foros
Autor:

Título:


Para preguntar utiliza los foros.



 Versión para imprimir

TripleDES - Un ejemplo practico en C#
Autor: Pedro Herrarte Sánchez
Visitas: 1811 Fecha de publicación: 22/04/2008
Pedro Herrarte, es consultor independiente, ofreciendo sercivios 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, bases de datos (SQL Server y ORACLE) e integración de sistemas.

Es experto en desarrollo (C#, ASP.NET, 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).

Es fundador, diseñador y programador de www.devjoker.com.



devjoker  Lo más nuevo ... Donde se habla ... 
01/07/2008 LinQ To SQL - Un ejemplo sencillo
11/06/2008 Problemas con el diseñador Web de Visual Studio 2008
03/06/2008 Formatear números en SQL Server
07/05/2008 Cómo activar Intelisense (autocompletado) en el Web.config
07/05/2008 Programas Open Source Alternativos
29/04/2008 Leer un campo XML de SQL Server 2005 con C#
22/04/2008 TripleDES - Un ejemplo practico en C#
21/04/2008 Ping
18/04/2008 Mostrar un GridView dentro de un DataList
13/04/2008 String.Format

Útimos temas recibidos en los foros ...
Problema de Proceso con el Timer en c# por BruneX ... [C#] 4 01/07/2008
Conectar ASP con B.D Informix por Franco ... [ASP] 11 02/05/2007
Store Procedure por Sistemas ... [ASP.NET] 7 28/05/2008
como insertar registros en un formulario de visual basic.net desde la base de datos sql server por orlan ... [SQL Server] 2 09/06/2008
problema sql por lourdes ... [SQL Server] 3 01/07/2008
PROBLEMAS CON CONEXION A ACCESS 2007 por daniel ... [Access] 2 19/05/2008
directorio activo y VB.NET por ZICK ... [Visual Basic .NET] 0 02/07/2008
Replica en Sql 2005 por Marcelino ... [SQL] 2 27/05/2008
tablas INDEX BY por Alberto ... [SQL] 0 02/07/2008
Convertir xls en csv por kayu ... [ORACLE] 3 17/06/2008
quiero mi numero de seguro social por margarita figueroa castro ... [Visual Basic .NET] 2 01/07/2008
Crystal Reports - Visual Studio 2005 por Broken ... [ASP.NET] 0 02/07/2008

Access CGI JSP ORACLE UNIX
Actualidad HTML/DHTML/XHTML LINUX PHP Visual Basic .NET
ASP ISAPI MS DOS Power Builder Visual Basic 6.0
ASP.NET Java mySQL SQL WIN 98/NT/2000/XP
C# JavaScript Opinion SQL Server

devjoker  Te recomendamos además ...
09/08/2007 Como mostrar el formato de fecha corta en un gridView
29/09/2006 Introducción a .NET    forma parte de...Conceptos generales .NET
29/09/2006 Assemblies    forma parte de...Conceptos generales .NET
29/09/2006 Metadatos    forma parte de...Conceptos generales .NET
22/10/2005 Consultas combinadas. JOINS    forma parte de...Tutorial SQL
29/09/2006 MSIL - Microsoft Intermediate Language    forma parte de...Conceptos generales .NET
21/02/2007 Subconsultas    forma parte de...Tutorial SQL
01/07/2008 LinQ To SQL - Un ejemplo sencillo
10/10/2006 Como conectar a ORACLE con Java
01/01/2006 Consultas agregadas    forma parte de...Tutorial SQL

 

Encuesta
Si trabajas con .NET ¿Que entorno utilizas?
[Ver] [Votar]