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();
 

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();



Preguntas similares