Foros del Web » Programación para mayores de 30 ;) » Java »

Problemas al enviar archivo encriptado atravez de sockets

Estas en el tema de Problemas al enviar archivo encriptado atravez de sockets en el foro de Java en Foros del Web. Hola que tal, tengo varias semanas intentando hacer que funcione una aplicasion cliente servidor utilizando sockets y el algoritmo de encriptacion DES. La aplicacion tiene ...
  #1 (permalink)  
Antiguo 20/07/2005, 08:38
 
Fecha de Ingreso: julio-2005
Mensajes: 1
Antigüedad: 18 años, 9 meses
Puntos: 0
Problemas al enviar archivo encriptado atravez de sockets

Hola que tal, tengo varias semanas intentando hacer que funcione una aplicasion cliente servidor utilizando sockets y el algoritmo de encriptacion DES. La aplicacion tiene que enviar y redireccionar ficheros comprimidos a uno o mas clientes. mi problema es que al momento de enviar el archivo encriptado me ocasiona problemas con el socket del servidor al momento de cerrar el flujo de los datos (InputStream). ademas de que me cierra el socket de comunicasion del servidor con el cliente.

a continuacion pongo parte de las funciones que utilizo para encriptar:

/**
* Use the specified TripleDES key to encrypt bytes from the input stream
* and write them to the output stream. This method uses CipherOutputStream
* to perform the encryption and write bytes at the same time.
*/
public static void encrypt(SecretKey key, InputStream in, OutputStream out)
throws NoSuchAlgorithmException, InvalidKeyException,
NoSuchPaddingException, IOException {
// Create and initialize the encryption engine
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.ENCRYPT_MODE, key);

// Create a special output stream to do the work for us
CipherOutputStream cos = new CipherOutputStream(out, cipher);

// Read from the input and write to the encrypting output stream
byte[] buffer = new byte[2048];
int bytesRead=0,cont=0;
while (( bytesRead = in.read(buffer)) != -1) {
cos.write(buffer, 0, bytesRead);
cont = cont + bytesRead;
}
System.out.println("Se han encriptado: "+cont+" bytes"+" bR: "+bytesRead);
cos.close();
// For extra security, don't leave any plaintext hanging around memory.
java.util.Arrays.fill(buffer, (byte) 0);
}

/**
* Use the specified TripleDES key to decrypt bytes ready from the input
* stream and write them to the output stream. This method uses uses Cipher
* directly to show how it can be done without CipherInputStream and
* CipherOutputStream.
*/
public static void decrypt(SecretKey key, InputStream in, OutputStream out)
throws NoSuchAlgorithmException, InvalidKeyException, IOException,
IllegalBlockSizeException, NoSuchPaddingException,
BadPaddingException {
// Create and initialize the decryption engine
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.DECRYPT_MODE, key);

// Read bytes, decrypt, and write them out.
byte[] buffer = new byte[2048];
int bytesRead,cont=0;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(cipher.update(buffer, 0, bytesRead));
cont = cont + bytesRead;
}
System.out.println("Se han desencriptado: "+cont+" bytes"+" bR: "+bytesRead);
// Write out the final bunch of decrypted bytes
out.write(cipher.doFinal());
out.flush();

}

y a continuacion pongo el codigo en donde resive mi aplicasion los datos en el servidor que es donde me esta ocasionando el conflicto:

public int RecibirArchivo(int resp){
try{
// Se generan las llaves para desencriptar la informacion
File keyfile = new File("C:/persona.txt");
SecretKey key = SR.generateKey();
SR.writeKey(key, keyfile);
NombreArchivo=le.LeerString(socket);
//Obtengo la longitud del archivo
long lon = le.LeerLong(socket);
//Obtengo el id de persona
id_persona=le.LeerString(socket);
//Se define la ruta donde va hacer espaldado el archivo
ruta = re.obtenRutaRespaldoArchivo(Integer.parseInt(id_pe rsona));
//Se crean dos flujos uno para leer la informacion atravez del socket
//el otro para escribir el archivo con la ruta ya especificada.
sIn =socket.getInputStream();
son = new FileOutputStream(ruta + NombreArchivo);
//Se comienza a desencriptar la informacion mandando los dos flujos donde
//se resive la informacio y donde va hacer almacenada
key = SR.readKey(keyfile);
SR.decrypt(key,sIn,son);

sIn.close(); //Aqui es donde me crea el problema al cerrar el socket y ya el cliente no se puede comunicar con el servidor.

//Si el parametro es igual a cero registra la transaccion como respaldo
//si no no se toma en cuenta el registro del respaldo
if (resp == 0){
//Se registra la transaccion del cliente que ha mandado la informacion
System.out.println("Registrando transaccion...");
bd.conexion();
bd.EjecutarSQL("INSERT INTO adm_movimientos(idm,id_persona,status,ruta,fecha)V ALUES('"+NombreArchivo+"',"+id_persona+",'S','"+ru ta+"', NOW() )");
bd.desconexion();
}
return 1;
}
catch(Exception e){
return 0;
}
}

en si es el codigo al cual no he podido encontrar solucion agradeceria su ayuda de ante mano
  #2 (permalink)  
Antiguo 20/07/2005, 15:07
Avatar de kittya  
Fecha de Ingreso: abril-2004
Mensajes: 260
Antigüedad: 20 años
Puntos: 0
a ver yo lo que entendi es que el problema esta cuando lo desencriptas o no ?



me ocasiona problemas con el socket del servidor al momento de cerrar el flujo de los datos (InputStream). ademas de que me cierra el socket de comunicasion del servidor con el cliente.


si cierras el stream obviamente cierras la comunicación

lo has intentado con un archivo que no encriptes

porque no creas un thread para leer hasta que el archivo sea = -1 end of file

y despues de recibirlo todo lo desencriptas


te marca algun error ? cual
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:56.