PDF de programación - Criptografía práctica

Criptografía prácticagráfica de visualizaciones

Actualizado el 24 de Noviembre del 2020 (Publicado el 17 de Julio del 2017)
725 visualizaciones desde el 17 de Julio del 2017
244,1 KB
6 paginas
fundamentos

Guillermo «Guille» Som

Criptografía práctica

El encriptador que lo encripte...debe guardar las claves
El desencriptador que lo desencripte...debe conocer las claves

La criptografía nos permite proteger los datos de forma tal, que la visualización
o modificación de los mismos solo sea posible para aquellos que conozcan la
forma en que han sido encriptados. Esto es aplicable no solo a la comunicación
entre dos puntos, sino también al contenido de nuestros ficheros.Además de
proteger la información,también podemos utilizar la criptografía para garantizar
que los datos no han sido alterados y que provienen de una fuente fiable.

Para realizar las tareas criptográficas, .NET Frame-
work nos ofrece una serie de clases en las que se imple-
mentan algoritmos criptográficos estandarizados; en
este artículo veremos algunos de esos algoritmos y cómo
usarlos desde C# (en el ZIP que acompaña al artículo
se incluye también el código para Visual Basic).

Primitivas criptografías
Existen diferentes formas de encriptación, conocidas como primitivas criptográ-
ficas. A continuación enumeramos esas primitivas y el uso que podemos darle.
• Cifrado de clave secreta (criptografía simétrica)

Realiza la transformación de los datos, impidiendo que terceros los lean. Este
tipo de cifrado utiliza una clave secreta compartida para cifrar y descifrar los
datos.

Cifrar y descifrar datos

Podemos realizar el cifrado de datos de dos formas
distintas, según sea grande o pequeño el tamaño de los
mismos. En el primer caso, podemos usar el cifrado
simétrico, en el cual intervienen secuencias (streams),
en particular una de tipo
CryptoStream, que será la
que pasemos a las clases
que utilizan este tipo de
cifrado. La segunda for-
ma de cifrado normal-
mente lo aplicaremos a
cantidades pequeñas de
datos, los cuales estarán
almacenados habitual-
mente en un array de
bytes.

• Cifrado de clave pública (criptografía asimétrica)

Realiza la transformación de los datos, impidiendo que terceros los lean. Este
tipo de cifrado utiliza un par de claves pública y privada para cifrar y desci-
frar los datos.

• Firmas criptográficas

Ayudan a comprobar que los datos se originan en una parte específica median-
te la creación de una firma digital única para esa parte. En este proceso tam-
bién se usan funciones hash.
• Valores hash criptográficos

Asigna datos de cualquier longitud a una secuencia de bytes de longitud fija.
Los valores hash son únicos estadísticamente; el valor hash de una secuencia
de bytes distinta no será el mismo.

Pero para poder rea-
lizar el cifrado (y poste-
riormente el descifrado)
necesitamos crear las
claves para cifrar y des-
cifrar esos datos. En el
caso de los algoritmos
simétricos, además de
una clave también hay
que generar un vector
de inicialización (IV -
Initialization Vector);

Guillermo “Guille”
Som
Es Microsoft MVP de
Visual Basic desde 1997.
Es redactor de ddoottNNeett--
MMaannííaa, mentor de SSoolliidd
QQuuaalliittyy IIbbeerrooaammeerriiccaannaa,
tutor de ccaammppuussMMVVPP,
miembro de Ineta Spea-
kers Bureau Latin Ame-
rica, y autor de los libros
“Manual Imprescindible
de Visual Basic .NET” y
“Visual Basic 2005”.
hhttttpp::////wwwwww..eellgguuiillllee..iinnffoo

<<

dnm.inicio.fundamentos

ambos hay que mantenerlos en secreto y solo deben
conocerlos las dos partes interesadas. Las clases uti-
lizadas en este tipo de algoritmos incluyen métodos
para generar esas claves, en particular los métodos
GenerateKey() y GenerateIV(), aunque también pode-
mos generarlas de forma manual, por ejemplo basán-
donos en una cadena; en cualquier caso, al instanciar
la clase, se generan tanto la clave como el IV de for-
ma automática.

En el código del fuente 1 podemos ver las dos for-
mas de generar esas claves para usar con la clase
DESCryptoServiceProvider. Si usamos una cadena a par-
tir de la que generar tanto la clave como el vector de
inicialización, debemos asegurarnos de que tiene los
bytes necesarios; ese valor lo obtenemos por medio
de la propiedad KeySize, que devuelve el número de
bits necesarios (1 byte = 8 bits).

Por otra parte, los algoritmos asimétricos deben
crear una clave pública y otra privada; la clave públi-
ca es la que se usará para cifrar el contenido y la
privada la usaremos para descifrarlo. Si no indica-
mos lo contrario en el constructor de las clases que
utilizan este tipo de algoritmos, se generarán
automáticamente claves con una longitud de 1024
bits, (128 bytes); el rango puede ser de 512 a 1024
en incrementos de 64 bits. Por supuesto, solo debe-
mos exponer la clave pública, que será la usada para
cifrar el mensaje, mientras que la clave privada la
usaremos para descifrarlo.

Estas clases implementan métodos para expor-
tar e importar las claves públicas y/o privadas. Por
ejemplo, si queremos generar una cadena en for-
mato XML con la clave pública podemos usar el
método ToXmlString() pasándole un valor falso

static void generarAuto()
{

// Crear claves simétricas automáticamente
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
// Estas llamadas no son necesarias
// ya que al crear la instancia se generan las claves
des.GenerateIV();
des.GenerateKey();
// Guardar las claves generadas
byte[] bIV = des.IV;
byte[] bKey = des.Key;
Console.WriteLine(“La longitud de la clave (KeySize) es de {0} bits”, des.KeySize);
Console.WriteLine(“La longitud de la clave es de {0} bytes”, bKey.Length);

}

static void generarManual(string clave)
{

// Crear la clave manualmente a partir de una cadena de texto
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
// Averiguar la longitud de las claves
int bits = des.KeySize;
// Establecer la clave secreta
// La longitud de la cadena debe ser de al menos (bits/8) bytes
int cant = bits / 8;
if (clave.Length < cant)
{

clave += new string(‘F’, cant - clave.Length);

}
// Convertir la cadena en un array de bytes
des.Key = Encoding.Default.GetBytes(clave.Substring(0, cant));
des.IV = Encoding.Default.GetBytes(clave.Substring(0, cant));
// Guardar las claves generadas
byte[] bIV = des.IV;
byte[] bKey = des.Key;
Console.WriteLine(“La longitud de la clave (KeySize) es de {0} bits”, des.KeySize);
Console.WriteLine(“La longitud de la clave es de {0} bytes”, bKey.Length);

}

Fuente 1. Generación de claves

a
í
n
a
M
t
e
N
t
o
d
<
<

43

<<

dnm.inicio.fundamentos

// La longitud de la clave puede ser de 512 a 1024 bits
// en incrementos de 64 bits
DSACryptoServiceProvider dsa = new DSACryptoServiceProvider(640);
Console.WriteLine(“La longitud de la clave es de {0} bits”, dsa.KeySize);

// Exportar las claves generadas como cadena XML
string clavePublica = dsa.ToXmlString(false);
Console.WriteLine(“Clave pública:\n{0}”, clavePublica);
Console.WriteLine();
// Las claves pública y privada
string clavePrivada = dsa.ToXmlString(true);
Console.WriteLine(“Clave pública y privada:\n{0}”, clavePrivada);

es permitirnos generar un valor hash,
por ejemplo del tipo SHA1, con el
contenido del texto a cifrar. Median-
te ese valor hash podemos comprobar
si el mensaje (o texto) ha sido modifi-
cado. De esta forma, el mensaje real-
mente no se cifra, sino solo los valo-
res de comprobación, ya que una de
las funcionalidades de este tipo de
algoritmos es obtener firmas digitales
de mensajes, de forma que podamos
comprobar la autenticidad del mismo.
Si quisiéramos cifrar el mensaje,
podremos usar cualquiera de las cla-
ses de cifrado simétrico o bien usar los

Fuente 2. Exportar las claves en formato XML

static void pruebaRSA()
{

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
string claves = rsa.ToXmlString(true);
string clavePublica = rsa.ToXmlString(false);
string texto = “Hola, Mundo”;

// Para cifrar solo es necesario la clave pública,
// aunque también podemos usar las dos claves
byte[] datosEnc = cifrarRSA(texto, clavePublica);

// Para descifrar necesitamos la clave pública y privada
string res = descrifrarRSA(claves, datosEnc);
Console.WriteLine(res);

}

static byte[] cifrarRSA(string texto, string clavePublica)
{

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
// La clave pública usada para cifrar el texto
rsa.FromXmlString(clavePublica);
// Convertimos la cadena a un array de bytes
byte[] datos = Encoding.Default.GetBytes(texto);
// Generamos los datos encriptados y los devolvemos
return rsa.Encrypt(datos, false);

}

static string descrifrarRSA(string claves, byte[] datosCifrados)
{

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
// Las claves usadas para cifrar el texto
rsa.FromXmlString(claves);
// Generamos los datos desencriptados
byte[] datos = rsa.Decrypt(datosCifrados, false);
// Devolvemos la cadena original
return Encoding.Default.GetString(datos);

Fuente 3. Cifrar y descifrar usando RSA

como parámetro; si queremos expor-
tar las dos claves, tendremos que usar
un valor verdadero como parámetro
de esa llamada.

En el código del fuente 2 vemos
cómo usar el método ToXmlString()
para guardar las claves usadas al crear
la instancia de la clase DSACryptoServi-
ceProvider.

Cifrado y descifrado
asimétrico

Podemos usar la clase RSACrypto-
ServiceProvider para cifrar y descifrar
textos de forma fácil ya que, a diferen-
cia de la clase DSACryptoServiceProvi-
der, expone métodos para realizar esas
tareas. Para cifrar un texto (en realidad
un array de bytes), usaremos el méto-
do Encrypt(), que devolverá un array
con el texto cifrado. Para descifrar un
texto previamente cifrado, usaremos el
método Decrypt(). En ambos casos
debemos usar las claves públicas y pri-
vadas. Si lo que queremos es cifrar los
datos, solo necesitamos la clave públi-
ca; pero para descifrar esos datos, nece-
sitaremos también la clave privada.

En el código del fuente 3 vemos
cómo podemos usar esta clase para cifrar
y descifrar un texto.

Comprobar firma digital

}

Una de las características de las
clases que utilizan cifrado asimétrico

a
í
n
a
M
t
e
N
t
o
d
<
<

44

<<

dnm.inicio.fundamentos

métodos que nos pe
  • Links de descarga
http://lwp-l.com/pdf5506

Comentarios de: Criptografía práctica (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad