Problemas con criptografía y sockets

14/03/2005 - 16:24 por Alejandro Castañaza | Informe spam
Hola.

Estoy haciendo un programa en el que necesito pasar ciertos datos
confidenciales a través de la red y, por lo tanto, decidí encriptarlos,
usando las clases del espacio de nombres System.Security.Cryptography.

Estoy utilizando sockets para la red, y hago primero un intercambio de
claves usando las clases de cifrado asimétrico, para establecer una clave
para el cifrado simétrico. El problema que tengo es que, aunque ya revisé y
los dos puntos llegan a tener la misma clave y vector de inicialización,
cuando el emisor de los datos envía la información, lo hace sin problemas,
pero la parte que las debe recibir, por alguna razón, el objeto CryptoStream
se queda bloqueado esperando la información, a pesar de que el NetworkStream
que utilizo para leer los datos de la red sí tiene los datos. Sé que por
usar sockets de bloqueo, se bloquean si no reciben datos, pero ya comprobé
que sí recibe los datos, y siempre se bloquea, no el NetworkStream, sino que
el CryptoStream. He probado de todo. Y no hay manera de que lleguen los
datos. También he utilizado StreamReader y StreamWriter (como en los
ejemplos de la documentación) y tampoco funciona.

Podrían ayudarme, por favor?
Llevo 2 días completos intentándolo, y me está atrasando, por favor
ayúdenme.

Alejandro.



Aquí les pongo las partes de código en cuestión:

Aquí es donde se reciben los datos (y donde se bloquea):

string mensaje;
NetworkStream stream = clienteTcp.GetStream();
// Crear el stream criptográfico
CryptoStream crStream = new
CryptoStream(stream,TDES.CreateDecryptor(tdesClave,tdesIV),
CryptoStreamMode.Read);
// Búfer de 8Kb
byte[] datos = new byte[8192];
int bytes;
int intentos = 25;
// Detectar si hay datos
while(intentos > 0)
{
if (stream.DataAvailable)
break;
intentos--;
System.Threading.Thread.Sleep(200);
}
// Si no hay datos salir
if (!stream.DataAvailable)
return String.Empty;
// Leer mensaje
bytes = crStream.Read(datos,0,datos.Length);
// Pasar a string
mensaje = System.Text.Encoding.Unicode.GetString(datos,0,bytes);


Aquí es donde se envían los datos:

NetworkStream stream = new NetworkStream(clienteTcp);
// Crear el stream criptográfico
CryptoStream crStream = new
CryptoStream(stream,TDES.CreateEncryptor(tdesClave,tdesIV),
CryptoStreamMode.Write);
// Convertir el string a una matriz de bytes
byte[] datos = System.Text.Encoding.Unicode.GetBytes(mensaje);
// Transmitir mensaje
crStream.Write(datos,0,datos.Length);
crStream.Flush();

Preguntas similare

Leer las respuestas

#1 ivanhoe_x
14/03/2005 - 17:37 | Informe spam
http://www.codeproject.com/managedc...lasses.asp

"Alejandro Castañaza" wrote in message
news:%
Hola.

Estoy haciendo un programa en el que necesito pasar ciertos datos
confidenciales a través de la red y, por lo tanto, decidí encriptarlos,
usando las clases del espacio de nombres System.Security.Cryptography.

Estoy utilizando sockets para la red, y hago primero un intercambio de
claves usando las clases de cifrado asimétrico, para establecer una clave
para el cifrado simétrico. El problema que tengo es que, aunque ya revisé


y
los dos puntos llegan a tener la misma clave y vector de inicialización,
cuando el emisor de los datos envía la información, lo hace sin problemas,
pero la parte que las debe recibir, por alguna razón, el objeto


CryptoStream
se queda bloqueado esperando la información, a pesar de que el


NetworkStream
que utilizo para leer los datos de la red sí tiene los datos. Sé que por
usar sockets de bloqueo, se bloquean si no reciben datos, pero ya comprobé
que sí recibe los datos, y siempre se bloquea, no el NetworkStream, sino


que
el CryptoStream. He probado de todo. Y no hay manera de que lleguen los
datos. También he utilizado StreamReader y StreamWriter (como en los
ejemplos de la documentación) y tampoco funciona.

Podrían ayudarme, por favor?
Llevo 2 días completos intentándolo, y me está atrasando, por favor
ayúdenme.

Alejandro.



Aquí les pongo las partes de código en cuestión:

Aquí es donde se reciben los datos (y donde se bloquea):

string mensaje;
NetworkStream stream = clienteTcp.GetStream();
// Crear el stream criptográfico
CryptoStream crStream = new
CryptoStream(stream,TDES.CreateDecryptor(tdesClave,tdesIV),



CryptoStreamMode.Read);
// Búfer de 8Kb
byte[] datos = new byte[8192];
int bytes;
int intentos = 25;
// Detectar si hay datos
while(intentos > 0)
{
if (stream.DataAvailable)
break;
intentos--;
System.Threading.Thread.Sleep(200);
}
// Si no hay datos salir
if (!stream.DataAvailable)
return String.Empty;
// Leer mensaje
bytes = crStream.Read(datos,0,datos.Length);
// Pasar a string
mensaje = System.Text.Encoding.Unicode.GetString(datos,0,bytes);


Aquí es donde se envían los datos:

NetworkStream stream = new NetworkStream(clienteTcp);
// Crear el stream criptográfico
CryptoStream crStream = new
CryptoStream(stream,TDES.CreateEncryptor(tdesClave,tdesIV),
CryptoStreamMode.Write);
// Convertir el string a una matriz de bytes
byte[] datos = System.Text.Encoding.Unicode.GetBytes(mensaje);
// Transmitir mensaje
crStream.Write(datos,0,datos.Length);
crStream.Flush();



Respuesta Responder a este mensaje
#2 Alejandro Castañaza
14/03/2005 - 18:20 | Informe spam
Gracias por la referencia, pero creo que necesito algo más sencillo, que
tener que conseguir certificados para SSL, mi aplicación es para una red
local. Quisiera saber qué es lo que estoy haciendo mal y por eso no
funciona este código.


"ivanhoe_x" escribió en el mensaje
news:%
http://www.codeproject.com/managedc...lasses.asp

"Alejandro Castañaza" wrote in message
news:%
Hola.

Estoy haciendo un programa en el que necesito pasar ciertos datos
confidenciales a través de la red y, por lo tanto, decidí encriptarlos,
usando las clases del espacio de nombres System.Security.Cryptography.

Estoy utilizando sockets para la red, y hago primero un intercambio de
claves usando las clases de cifrado asimétrico, para establecer una clave
para el cifrado simétrico. El problema que tengo es que, aunque ya
revisé


y
los dos puntos llegan a tener la misma clave y vector de inicialización,
cuando el emisor de los datos envía la información, lo hace sin
problemas,
pero la parte que las debe recibir, por alguna razón, el objeto


CryptoStream
se queda bloqueado esperando la información, a pesar de que el


NetworkStream
que utilizo para leer los datos de la red sí tiene los datos. Sé que por
usar sockets de bloqueo, se bloquean si no reciben datos, pero ya
comprobé
que sí recibe los datos, y siempre se bloquea, no el NetworkStream, sino


que
el CryptoStream. He probado de todo. Y no hay manera de que lleguen los
datos. También he utilizado StreamReader y StreamWriter (como en los
ejemplos de la documentación) y tampoco funciona.

Podrían ayudarme, por favor?
Llevo 2 días completos intentándolo, y me está atrasando, por favor
ayúdenme.

Alejandro.



Aquí les pongo las partes de código en cuestión:

Aquí es donde se reciben los datos (y donde se bloquea):

string mensaje;
NetworkStream stream = clienteTcp.GetStream();
// Crear el stream criptográfico
CryptoStream crStream = new
CryptoStream(stream,TDES.CreateDecryptor(tdesClave,tdesIV),



CryptoStreamMode.Read);
// Búfer de 8Kb
byte[] datos = new byte[8192];
int bytes;
int intentos = 25;
// Detectar si hay datos
while(intentos > 0)
{
if (stream.DataAvailable)
break;
intentos--;
System.Threading.Thread.Sleep(200);
}
// Si no hay datos salir
if (!stream.DataAvailable)
return String.Empty;
// Leer mensaje
bytes = crStream.Read(datos,0,datos.Length);
// Pasar a string
mensaje = System.Text.Encoding.Unicode.GetString(datos,0,bytes);


Aquí es donde se envían los datos:

NetworkStream stream = new NetworkStream(clienteTcp);
// Crear el stream criptográfico
CryptoStream crStream = new
CryptoStream(stream,TDES.CreateEncryptor(tdesClave,tdesIV),
CryptoStreamMode.Write);
// Convertir el string a una matriz de bytes
byte[] datos = System.Text.Encoding.Unicode.GetBytes(mensaje);
// Transmitir mensaje
crStream.Write(datos,0,datos.Length);
crStream.Flush();







Respuesta Responder a este mensaje
#3 Alejandro Castañaza
15/03/2005 - 01:22 | Informe spam
Ya resolví mi problema.

Usé el cryptostream en el receptor para escribir a un memorystream, en lugar
de leer del networkstream.
Parece que el cryptostream no quiere leer de un networkstream. Será un
error del .net?

Gracias a todos por su ayuda.

Alejandro.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida