InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
También puedes ver ...
SubVersion y Visual Studio
Usuarios del sistema en Windows (servicios)
Encriptación con AES Rijndael - Ejemplo
Insertar una marca de agua en documentos PDF
Serialización: XmlSerializer y BinaryFormater
Handler para manipular imagenes
Conversiones de tipos personalizadas (VB y C#)
Compresión por gzip y deflate
La página Web que está abriendo contiene tanto elementos seguros como no seguros.
Cómo insertar un fichero .xml en un campo de tipo XML de SQL server 2005 o 2008


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


 Versión para imprimir  Foros de consulta

 
como reutilizar el codigo de desencriptar en JAVA por alexandra
Respuesta recibida el [17/09/2008 02:07:06]
Preimero qeu todo magnifico de articulo funciona perfectamente...


Mi problema es el siguiente yo tengo un webservices desarrollado en JAVA-ECLIPSE y envio un parametro encriptado con su codigo pero despues debo reutilizar la funcion de desencriptar... y la verdad se poco de JAVA-ECLIPSE..

agradezco cualquier AYUDA

 
Crypto por Andres Camargo
Respuesta recibida el [07/01/2009 09:41:23]
Formate el pc y despues haces un ipconfig al servidor de google.com

 
JAVA-ECLIPSE por slent
Respuesta recibida el [29/01/2009 10:44:52]
En esos casos solo queda..... cambiar de carrera.

 
No Funciona para este caso por JosPonce
Respuesta recibida el [09/06/2009 06:01:37]
si guardo el resultado de mi funcion encriptar en bd y luego quiero recuperarlo ya cuando las propiedades de la clase TripleDESUtil, IV y Key cambiaron este manda un error.
como podemos recuperar estos desde otro lado sin que de el error y pasarles las mismas IV y Key que aparentemente es el que produse el problema.

 
Guarda la key y el IV por Devjoker
Respuesta recibida el [10/06/2009 03:55:36]
Debes guardar tambien la key y el iv, sino no podrás desencriptar.
Precisamente ... ¡se trata de eso!, de que nadie que no sepa el key y el iv pueda descrifrar tu informacion.

 
encriptar por Mihai Mosor
Respuesta recibida el [17/12/2009 03:01:19]
El artículo está muy bien. Gracias por la aportación. TripleDES está bien, encontré algo de AES, pero modificado al antojo del quién lo tenía, porque éste es configurable. Menos mal que no es unidireccional, como HashCode, porque sino... 
AES-Rijndael lo utiliza el Gobierno de EE.UU, siendo un algoritmo seguro, relativamente fácil de utilizar, no necesita mucha memoria, siendo todos los algoritmos de encriptación recursivos, gastan memoria del ordenador; éste parece que es la receta 'perfecta'.
Saludos();
Mihai

 
Excelente por xuser83
Respuesta recibida el [19/12/2009 03:33:50]
Muy buen articulo, muchas gracias desde latinoamerica...


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: 14487 Fecha de publicación: 17/12/2009
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, 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.




Visitas: 86 | Comentarios: 2 | Archivo: Articulos
02/02/2010 iPad vs Telesketch
Visitas: 791 | Comentarios: 2 | Archivo: Articulos
Categorias: Humor
Visitas: 739 | Comentarios: 3 | Archivo: Articulos
Visitas: 3134 | Comentarios: 2 | Archivo: Articulos
Categorias: C#
Visitas: 14487 | Comentarios: 7 | Archivo: Articulos
Categorias: C#|Seguridad
Visitas: 1474 | Comentarios: 3 | Archivo: Articulos
Visitas: 690 | Comentarios: 2 | Archivo: Articulos
Visitas: 368 | Comentarios: 0 | Archivo: Articulos
Visitas: 2006 | Comentarios: 2 | Archivo: Articulos
Categorias: C#

Útimos temas recibidos en los foros ...
certificado pensiones horizonte por angela patricia rodriguez ... [Actualidad] 135 26/01/2010
pensiones por eduard ... [Visual Basic 6.0] 0 11/03/2010
Manual Visual Studio.NET por Shiko ... [Visual Basic .NET] 41 26/10/2006
cap de setmana genial por ramón ... [Java] 0 11/03/2010
cetificado de pension por RICARDDO RAFAEL SOLANO ORZCO ... [Actualidad] 0 11/03/2010
solicitud de aifiliacion a porvernir por julios ... [Actualidad] 2 11/03/2010
Solicitar el certificado de pensiones de Abelardo Alfonso Serrano Banegas C.C. 18 971 771 de Curumani Cesar por Marta ... [Actualidad] 0 11/03/2010
Solicitud certificado de afiliaciones a pensiones y cesantias proteccion por hz ... [Actualidad] 50 10/02/2010
cerificado fondo horizonte de pensiones y cesantias por carlos fideligno torres herrera ... [Actualidad] 146 18/01/2010
certificado de afiliación de pensiones y cesantias por secre ... [Actualidad] 109 28/01/2010
certificado de fondos de pensiones horizonte por mona ... [Actualidad] 5 03/03/2010
Certificado de afiliacion AFP (PENSIONES) Horizonte por Sandris ... [Actualidad] 68 30/01/2010

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 ...
16/04/2004 C# y como crear instancias de clases desde un tipo String utilizando .NET FrameWork.
21/07/2006 Funciones integradas de PL/SQL    forma parte de...Tutorial PL/SQL
09/05/2006 Como leer XML con C#
22/10/2005 Actualización de datos. UPDATE    forma parte de...Tutorial SQL
03/10/2006 Fundamentos de C#    forma parte de...Tutorial C#
05/07/2007 Consultar datos en Transact SQL    forma parte de...Tutorial de Transact SQL
12/01/2006 Introducción a PLSQL    forma parte de...Tutorial PL/SQL
19/10/2006 Llamadas asíncronas    forma parte de...Tutorial C#
14/07/2006 Tablas PL/SQL    forma parte de...Tutorial PL/SQL
22/10/2005 Introducción SQL    forma parte de...Tutorial SQL

 

Encuesta
¿A que perfil te adaptas mejor?




[Ver] [Votar]