Descifrar un archivo codificado como byte []

Bueno, esto es en realidad un dos partes ...

Primero necesito

  1. leer el contenido del archivo
  2. criptándolos en un byte[]
  3. escribir el byte[]en un archivo o lo que sea ...

Entonces el resultado del # 2 o # 3 irá a otro proyecto. Estoy tratando de proteger nuestras teclas PEM / DER.

Para descifrar, necesito

  1. lea el contenido del archivo encriptado como byte[]
  2. descifrarlos en un byte[]
  3. escribir los datos descifrados en un archivo O usarlos en lugar de un archivo

Ahora tengo un código de cifrado básico

        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
    keyGenerator.init(128); // 192 and 256 bits may not be available

    SecretKey secretKey = keyGenerator.generateKey();

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");


    // By initializing the cipher in CBC mode, an "initialization vector" has been randomly
    // generated. This initialization vector will be necessary to decrypt the encrypted data.
    // It is safe to store the initialization vector in plain text for later use. You can obtain
    // it's bytes by calling iv.getIV().
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);
    IvParameterSpec iv = cipher.getParameters().getParameterSpec(IvParameterSpec.class);
        //      IvParameterSpec iv = new IvParameterSpec(IV); //used for the hardcoded one

        byte[] encryptedData = cipher.doFinal(data);

y descifrar uno también

    cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
    byte[] decryptedData = cipher.doFinal(encryptedData);
    System.out.println("decrypted: " + new String(decryptedData));

y la pregunta es:

Dado un escenario de caso de uso en el que rara vez se cifraría algo y distribuiría claves cifradas que se descifrarán en tiempo de ejecución, ¿qué necesito guardar aparte del texto cifrado?

Sé que necesito guardar el IV, pero cuando hice el descifrado no fue del todo bueno, lo que me lleva a creer que también necesito guardar la clave secreta.

¿Alguien podría darme algún consejo, consejos o sugerencias generales de seguridad para una mejor solución? Si necesito guardar la clave, el IV y los datos cifrados, ¿dónde debo guardarlos? ¿Tal vez codificar la clave y almacenar el IV junto con los datos cifrados? ¿Tal vez codificar tanto el IV como la clave y simplemente almacenar datos cifrados en los archivos?

No se trata de seguridad teórica, piense en esto como el mayor inconveniente e inconveniente que puede causarle a alguien que está tratando de robarle las llaves. Todos sabemos que no hay forma de que pueda ocultarlos perfectamente.

Casi necesito lo que este tipo comenzó con Descifrar un archivo cifrado y ejecutarlo en Java

Sin embargo, si hay una mejor manera de alimentar datos seguros en un PemKeyReader, estoy enterado.

Respuesta 1

Compartir la clave y cifrar algo son dos cosas completamente diferentes. Cómo compartir llaves

Dicho esto, AEScon 128 bits es un algoritmo de cifrado bastante fuerte que 3DESEntonces, lo que puede hacer es mantener la PKIinfraestructura en su lugar para intercambiar AES keysy luego Cifrar y Descifrar usándolos.

¿Por qué no RSA? RSAdebe tener un mínimo de 512 bits para considerarlo más fuerte y si aumenta más bits, entonces aumenta el tiempo requerido para el cifrado y descifrado.

SO AES es rápido y seguro.

Use SecretKeySpec para crear clave desde el byte []

public static void main(String[] args) throws Exception
{
    // Initialise secret key with predefined byte array [] like below. I
    // have used simple string to array method to generate 16 byte array.
    // AES Key must be minimum 16 bytes.
    // Now you can put this byte array some where is .SO file.
    // Generate new Key using this byte []
    // Then you can generate a key using device specific information at
    // first boot up.
    // Use second key to encrypt data and first key to encrypt the second
    // key
    // I Hope it clears all the doubts
    SecretKey key = new SecretKeySpec("ABCDEFGHIJKLMNOP".getBytes(), "AES");
    System.out.println(Arrays.toString(key.getEncoded()));
    // Initialise Cipher with AES Algorithm
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    // Set The Encrypt Mode
    cipher.init(Cipher.ENCRYPT_MODE, key);
    // Encrypt some bytes
    byte[] encrypted = cipher.doFinal("ABCDEFGH".getBytes());
    // Print it to vefiry
    System.out.println(Arrays.toString(encrypted));

    // Get The IV
    byte[] iv = cipher.getIV();
    System.out.println(iv.length);
    // Now why storing you can create structure like [16 IV][Encrypted Data]
    // And while decrypting you can read first [16] bytes IV and then
    // decrypt remaining bytes

    //byte[] iv = new byte[16];
    // System.arraycopy(encrypted, 0, iv, 0, 16)
    //Copy remaining bytes to decrypt


    // set cipher to decrypt mode

    cipher.init(Cipher.DECRYPT_MODE, key,new IvParameterSpec(iv));

    // decrypt it
    byte[] decrypted = cipher.doFinal(encrypted);
    System.out.println(new String(decrypted));

}

Ahora escriba un algoritmo que generará byte [] a partir de algunos datos aleatorios como el nombre del dispositivo, el nombre de usuario, la semilla aleatoria, etc.

Puede agregar más protección al código fuente del algoritmo escribiendo ese algoritmo Cy creando un .SOarchivo y byte []utilizándolo Native calls.

¿Cuáles son las ventajas de hacer todo esto?

  1. Si su pirateo es así, necesitará un entorno en tiempo real para ejecutar la creación de clave.
  2. Incluso si alguien lo rompe, el daño será limitado, es decir, 1 dispositivo
  3. El hacker tendrá que repetir lo mismo con cada dispositivo, lo cual es muy imposible de hacer.
Respuesta: 2

Estoy tratando de automatizar la creación de un proyecto Eclipse Java. Necesito una manera de hacer esto usando la línea de comando. Encontré muchos artículos para esto para CDT, pero no para el de Java. ¿Hay alguna manera de ...

Uso Java 7. Me gustaría extraer el idioma y el país de una Cadena que represente un nombre de archivo de paquete o un nombre de archivo de propiedades. El nombre del archivo no contiene la extensión. Por ejemplo paquete ...

Estoy confundido por una de las preguntas en mi examen de práctica. En Java, la clase Integer extiende la clase abstracta base Número. Ahora, supongamos que tenemos un método con una firma de la siguiente manera: ...

Tengo el siguiente código: intente {jArray = new JSONArray (resultado); JSONObject json_data = nulo; Cadena myString = nulo; para (int i = 0; i <jArray ....