Académique Documents
Professionnel Documents
Culture Documents
Facultad : Ingeniería
Escuela : Computación
Asignatura: Programación III
Tema: “CIFRADO”.
Objetivo
Introducción
Cuando dos partes remotas intercambian datos a través de un canal inseguro (como por
ejemplo), ambas partes deben garantizar que los datos comunicados:
Consejo: Cualquier algoritmo que cambie de cierta manera un texto no se puede considerar
un algoritmo encriptado, sino simplemente “transformador” (por ejemplo, aplicar un XOR a
una cadena de texto produce un resultado que, como no lo entendemos, creemos que la
información está encriptado, cuando en realidad un hacker podría obtener la información
fácilmente). Así que, si vamos a proteger información, debe hacerse con algoritmos
probados.
Programación III, Guía 11 2
En la encriptación simétrica se utiliza una única clave secreta para cifrar y descifrar los datos
(de ahí la denominación de simétrica). Son algoritmos muy rápidos, por eso se utilizan para
grandes secuencias de datos.
AES, también conocido como Rijndael (aunque no son exactamente lo mismo), es de amplia
aceptación a nivel mundial. Hoy en día es el más seguro y rápido.
Cualquiera de estos algoritmos utiliza los siguientes dos elementos (ninguno de los dos
debe pasarse por alto ni subestimarse su importancia):
• IV (Vector de inicialización).
• Key (llave).
Ejemplo de funcionamiento.
• Ana y José acuerdan utilizar un algoritmo en particular con una clave y vector de
inicialización concretos.
• Ana redacta un mensaje y cifra el texto usando la clave y el vector de inicialización y
se lo envía a José por Internet.
• José recibe el texto cifrado y lo descifra utilizando la clave y el vector acordados
anteriormente.
Cuanto más grande sea el tamaño de la llave, más difícil será obtenerla mediante un
ataque por fuerza bruta. Para el algoritmo de Rijndael, las claves pueden ser de 128,
192 y 256 bits de longitud. Por ejemplo, para una clave de 64 bits de longitud, a un ritmo
de comprobación de 50 claves por segundo, podría llevar unos 11,6 billones de años en
comprobar todos los valores posibles de la clave.
En un esquema de cifrado por bloques (como Rijndael), la secuencia de texto sin cifrar
se parte en bloques para su procesamiento. Para una clave secreta determinada, un
cifrado que no utilice un vector de inicialización codificará el mismo bloque de entrada de
texto sin cifrar en el mismo bloque de salida de texto cifrado. Si hay bloques duplicados
dentro la secuencia de texto a cifrar, habrá bloques duplicados en la secuencia de texto
cifrado. Si el hacker sabe algo acerca de la estructura de un bloque del texto sin cifrar,
puede utilizar esa información para descifrar el bloque de texto cifrado conocido y,
posiblemente, recuperar la clave.
Para combatir este problema, la información del bloque anterior se mezcla en el proceso
de cifrado del bloque siguiente. Así pues, el resultado de dos bloques idénticos de texto
sin cifrar es distinto. Como esta técnica utiliza el bloque anterior para cifrar el bloque
siguiente, se utiliza un IV para cifrar el primer bloque de datos. Con este sistema, los
encabezados de los mensajes comunes que un hacker podría conocer no pueden
utilizarse para aplicar técnicas de ingeniería inversa en una clave.
Los algoritmos de cifrado de bloque como DES o AES separan el mensaje en bloques de
tamaño fijo para su procesamiento, por ejemplo 128 bits. La forma en que se gestionan
estos bloques se denomina “modo de cifrado”. Los modos de cifrado que soporta .NET
Framework son ECB, CBC, y CFB (es preferible usar CBC).
Modos de relleno.
La mayoría de los mensajes de texto a cifrar no contienen los bytes necesarios para
rellenar totalmente los bloques. A menudo, no hay bytes suficientes para rellenar el
último bloque. Cuando esto sucede, se agrega una cadena de relleno al texto. Por
ejemplo, si la longitud del bloque es de 64 bits y el último bloque sólo contiene 40 bits, se
agregan 24 bits de relleno. .NET Framework soporta dos modos de relleno:
Es el método criptográfico que usa un par de claves para el envío de mensajes. Las dos claves
pertenecen a la misma persona que ha enviado el mensaje. Una clave es pública y se puede
entregar a cualquier persona, la otra clave es privada y el propietario debe guardarla de modo
que nadie tenga acceso a ella. Además, los métodos criptográficos garantizan que esa pareja
de claves sólo se puede generar una vez, de modo que se puede asumir que no es posible
que dos personas hayan obtenido casualmente la misma pareja de claves.
Si el remitente usa la clave pública del destinatario para cifrar el mensaje, una vez cifrado, sólo
la clave privada del destinatario podrá descifrar este mensaje, ya que es el único que la
conoce. Por tanto se logra la confidencialidad del envío del mensaje, nadie salvo el destinatario
puede descifrarlo.
En esta guía se describe cómo utilizar las clases de cifrado que proporciona Microsoft
.NET Framework para cifrar un archivo de texto en un estado ilegible y descifrar después
ese archivo para devolverlo a su estado original.
Materiales y equipo
Procedimiento
Ejercicio 1:
Ejercicio 2:
En el escritorio cree una carpeta de manera que coincida con la ruta dirPruebas. A
continuación cree un proyecto modo consola en C# .NET. Con el nombre de
cifradoRSA_CS.
using System;
using System.Text;
using System.Security.Cryptography;
using System.IO;
namespace cifradoRSA_CS
{ class Program
{
private static string dirPruebas = @"C:\Users\usuario\Desktop\Guia de
Cifrado\cifradoRSA_CS\RSA cripto";
private static string ficPruebas = Path.Combine(dirPruebas,
"MisClaves_CS.xml");
Ejemplo 2:
Antes de crear la aplicación debe tomar en cuenta la ruta donde será guardada (ver parte
final del código) y deberá crear los tres archivos .txt a utilizar (Mydata.txt, Encryted.txt,
Decrypt.txt) Posterior a ello cree un proyecto modo consola en C# .NET. Con el nombre
de CSEncryptDecrypt
using System;
using System.IO;
using System.Security;
using System.Security.Cryptography;
using System.Runtime.InteropServices;
using System.Text;
namespace CSEncryptDecrypt
{ class class1
Programación III, Guía 11 10
{
// Llamar a esta función para quitar la clave de la memoria después de su
uso por seguridad
[System.Runtime.InteropServices.DllImport("KERNEL32.DLL", EntryPoint =
"RtlZeroMemory")]
public static extern bool ZeroMemory(IntPtr Destination, int Length);
// Función para generar una clave de 64 bits.
static string GenerateKey()
{
// Crear una instancia del algoritmo simétrico. La clave y el IV se generan
automáticamente.
DESCryptoServiceProvider desCrypto =
(DESCryptoServiceProvider)DESCryptoServiceProvider.Create();
// Utilizar la clave generada automáticamente para el cifrado.
return ASCIIEncoding.ASCII.GetString(desCrypto.Key);
}
static void EncryptFile(string sInputFilename, string sOutputFilename,
string sKey)
{
FileStream fsInput = new FileStream(sInputFilename, FileMode.Open,
FileAccess.Read);
Análisis de resultados
Investigación complementaria.
Referencia.
• http://support.microsoft.com/kb/307010/es
• http://copstone.com/2010/03/encriptacion-en-c-sharp/
Programación III, Guía 11 13
Hoja de cotejo: 11
EVALUACION
CONOCIMIENTO
40
APLICACIÓN
DEL 40
CONOCIMIENTO
ACTITUD
20
TOTAL
100%