Cifrar un archivo añadiendo clave envuelta en un único archivo

Iniciado por lagranladilla, 25 Marzo 2015, 13:16 PM

0 Miembros y 1 Visitante están viendo este tema.

lagranladilla

Hola! (Link StackOverflow https://stackoverflow.com/questions/29239854/encrypt-a-file-appending-wrapped-key-in-unique-file)
La idea de lo que estoy intentando hacer es lo siguiente:
Tenemos:
- Archivo de N bytes
- Clave AES de 256 bytes
- Pareja de claves RSA.

La idea es:
1 - cifrar el archivo en bloques de 1024 Bytes con la clave AES
2 - cifrar la clave AES con la clave publica RSA
3 - Añadir lla clave cifrada (wrapped key) al principio del archivo

Ahora tenemos un archivo cifrado en que los primeros 256 Bytes son la llave cifrada y el resto del archivo esta cifrado en bloques de 1024 bhytes.

Para descifrar:
1 - Recuperar los primeros 256 bytes.
2 - Desencriptarlos usando la llave privada. De este modo hemos recuperado la llave AES que tenemos que usar para descifrar el resto del archivo

Y ahora la pregunta!!!

Como puedo descifrar el resto del archivo, en bloques de 1024, sin tener en cuenta los primeros 256 bytes?????



El codigo de como lo hago esta en el stackOverflow... Estoy muy confuso y no lo consigooooo!!!! :'(
https://stackoverflow.com/questions/29239854/encrypt-a-file-appending-wrapped-key-in-unique-file

LA pregunta no es una cuestion de cifrado, la cuestion es una cuestion de como acceder a un archivo binario en bloques i a con un offset de n bytes...

Gracias de antemano!

engel lex

espera XD vas a cifrar el archivo y luego a cifrar la llave para meterlo todo junto?

es como agarrar una caja y meter un documento, luego agarrar una caja más grande y meter la caja con el documento mas la llave XD

para eso se supone que tienes RSA desde un principio la cosa es que si quieres hacer más seguridad no la tendrás porque si te rompen la llave rsa tienen la llave aes...

solo cifra con rsa y una clave lo suficientemente larga y listo, en ese aspecto rsa es más pesado que aes
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

lagranladilla

Tengo entendido que las claves RSA tienen una limitacion en cuanto a cantidad de bytes que la clave publica puede cifrar.

Y tengo entendido que la solucion a este problema era usar una wrapped key, en que se utiliza una llave AES para cifrar el archivo y que se envia el archivo cifrado mas la llave AES cifrada con la clave publica.

Entonces el receptor descifra la clave AES con su privada y asi descifrar el archivo...

Queria hacer eso pero en un unico archivo.

Cree que podria hacerlo unicamente con RSA??? Tengo problemas para cifrar con RSA archivos de gran tamaño :S

Gracias!

engel lex

sorry, se me lo que dije XD

tienes razón estaba hablando locuras... entendí lo que no era...


si, cifras aes, cifras el pass coon rsa y una clave lo suficientemente larga (las (claves rsa normalmente son 2048 bytes, pero son flexibles al largo deseado)

lo que quieres...

lees el archivo... no se de java pero según la documentación oficial
http://docs.oracle.com/javase/tutorial/essential/io/rafs.html

lees 256 bytes y luego vas de 1024 en 1024 (yo me imagino que el puntero queda en el byte siguiente al ultimo leído)
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Usuario Invitado

Creo que ya solucionó su problema, viendo su comentario a la respuesta aceptada hace 1 hora:

CitarOk it works! Using the same FileInputStream of the first 256... A newbie error! thx! Maybe there are a better thing for do that?
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

lagranladilla

En efecto.

El problema era que instanciava un nuevo fileinputstream en vez de usar el que ya havia leido los primeros 256 bytes >.<!!

Solved!

Usuario Invitado

Jaja suele pasar no te preocupes. No sé si podrías poner el código completo por si le sirve a alguien más en el futuro.

Un saludo.
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

lagranladilla

El codigo es el del stack Overflow, pero en el proyecto finalmente a quedado del siguiente modo:

Código (java) [Seleccionar]


    public static void fileEncripWrapped(File in, File out, PublicKey pub, byte [] key) {
       
        try {
            SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
                 
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            cipher.init(Cipher.WRAP_MODE, pub);
            byte[] encKey = cipher.wrap(keySpec);
           
            FileOutputStream osAppend  = new FileOutputStream(out);
           
            osAppend.write(encKey);
            osAppend.close();
           
             cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
            cipher.init(Cipher.ENCRYPT_MODE, keySpec);
           
            FileInputStream is = new FileInputStream(in);
            CipherOutputStream os = new CipherOutputStream(new FileOutputStream(out, true), cipher);
           
            copy(is, os);
   
            is.close();
            os.close();
           
        } catch (Exception ex) {
            System.err.println("Ha succeït un error xifrant: " + ex);
        }
    }
   
    public static void fileUncryptWrapped(File in, File out, PrivateKey priv) {
        try {
           
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            cipher.init(Cipher.UNWRAP_MODE, priv);
           
            InputStream is = new FileInputStream(in);
            byte[] bufferKey = getFirstBytes(is, 256);
           
            Key ky = cipher.unwrap(bufferKey, "AES", Cipher.SECRET_KEY);
           
            cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
            cipher.init(Cipher.DECRYPT_MODE, ky);

           CipherInputStream cIs = new CipherInputStream(is, cipher);
           FileOutputStream os = new FileOutputStream(out);
           
           copy (cIs  , os);
           
           is.close();
           cIs.close();
           os.close();
           
        } catch (Exception ex) {
            System.err.println("Ha succeït un error xifrant: " + ex);
        }
    }


Y por otro lado :

Código (java) [Seleccionar]

/**
     * Copy the bytes of input string to bytes in output string in blocks of 1024 bytes
     * @param is - InputStream
     * @param os - OutputStream
     * @throws IOException
     */
    private static void copy(InputStream is, OutputStream os) throws IOException { //http://www.macs.hw.ac.uk/~ml355/lore/pkencryption.htm
        int i;
        byte[] b = new byte[1024];
        while((i=is.read(b))!=-1) {
          os.write(b, 0, i);
        }
    }
   
    /**
     * Get the first n bytes of a binary file
     * @param is - InoutStream
     * @param size - Size do you want to take.
     * @return
     */
    private static byte [] getFirstBytes (InputStream is, int size) {
        byte [] bytes = new byte [size];
        try {
            if (is.read(bytes) != bytes.length) {
                is.close();
                throw new IllegalStateException("Too short file");
            }
        } catch (IOException ex) {
            Logger.getLogger(Asimetric.class.getName()).log(Level.SEVERE, null, ex);
        }
        return bytes;
    }


Ojala sirva!
La idea no se si es buena. Incorporar en el mismo archivo la llave para descifrar... La verdad es que me gustaría profundizar en el tema, con el tiempo!   ;-)

Alomejor posteo en algún tiempo alguna mejora del codigo que tengo pensar de hacer para optimizar y reducir algoritmos.

Salut!