InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
También puedes ver ...
TransactionScope - Simplificando el trabajo con transacciones.
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
Métodos Extensores: INNER JOIN
String.Format
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

Afiliados
La Web del programador
MundoProgramacion


 

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: 2634 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.




18/08/2008 SQL Server 2008
Visitas: 39 | Comentarios: 0 | Archivo: Articulos
Categorias: Transact-SQL
Visitas: 131 | Comentarios: 0 | Archivo: Articulos
Categorias: C#|ADO.NET|LinQ
Visitas: 161 | Comentarios: 1 | Archivo: Articulos
Categorias: Humor
Visitas: 154 | Comentarios: 0 | Archivo: Articulos
Categorias: WCF
Visitas: 123 | Comentarios: 0 | Archivo: Articulos
Categorias: WCF
Visitas: 210 | Comentarios: 0 | Archivo: Articulos
Categorias: ASP.NET
Visitas: 278 | Comentarios: 5 | Archivo: Articulos
Categorias: ASP.NET
Visitas: 4990 | Comentarios: 4 | Archivo: Articulos
Categorias: C#|Transact-SQL|LinQ
Visitas: 603 | Comentarios: 1 | Archivo: Articulos
Categorias: Visual Studio
Visitas: 1402 | Comentarios: 1 | Archivo: Articulos
Categorias: Transact-SQL

Útimos temas recibidos en los foros ...
MAQUINAS VIRTUALES por victor ... [WIN 98/NT/2000/XP] 0 19/08/2008
Y lo mismo en WEB por systemat ... [C#] 1 18/08/2008
Manual del minicom de Linux con fotos. por Meta ... [UNIX] 4 17/08/2008
PROGRAMACION por JUANMA ... [Visual Basic .NET] 1 19/08/2008
Conectar ASP con B.D Informix por Franco ... [ASP] 9 02/05/2007
Codigo salir por Jazmin ... [ASP.NET] 1 18/08/2008
EXPORTAR DATOS A ARCHIVOS PLANOS. por WIX ... [ORACLE] 10 06/08/2007
formulario por artdark ... [C#] 2 04/08/2008
Codigo salir por Jazmin ... [ASP.NET] 0 18/08/2008
cambiar de modo un gried view por ivan ... [ASP.NET] 0 18/08/2008
ayuda urgente porfavor por vicancer ... [ASP.NET] 0 18/08/2008
pollo por hajaj ... [Actualidad] 1 15/08/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 ...
24/07/2006 SQL Dinamico    forma parte de...Tutorial PL/SQL
09/10/2006 Cadenas de texto    forma parte de...Tutorial C#
22/10/2005 Tablas    forma parte de...Tutorial SQL
09/08/2007 Como mostrar el formato de fecha corta en un gridView
02/09/2007 Procedimientos almacenados en Transact SQL    forma parte de...Tutorial de Transact SQL
25/08/2007 Variables en Transact SQL    forma parte de...Tutorial de Transact SQL
03/10/2006 Introduccion a C#    forma parte de...Tutorial C#
21/02/2007 BULK COLLECT    forma parte de...Tutorial PL/SQL
28/08/2006 Ubuntu en VmWare con VMware Tools
11/06/2008 Problemas con el diseñador Web de Visual Studio 2008

 

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