Encriptación AES IV

Estoy usando esto a continuación (E.1) para mi aplicación, obviamente hay un enorme agujero de seguridad evidente en esto que reconozco y entiendo. Me he interesado en el cifrado y quiero entenderlo mejor, necesito generar una clave aleatoria junto con un IV, pero no estoy seguro de cómo hacerlo correctamente. ¿Puede alguien explicarme quién está familiarizado con el cifrado AES cómo funciona? (IV y KEY ) Así que puedo entender mejor en el futuro y puedo aplicar mi conocimiento, esencialmente solo quiero hacer que el código sea más seguro, gracias.

(E.1)

    byte[] key = "mykey".getBytes("UTF-8");

    private byte[] getKeyBytes(final byte[] key) throws Exception {
        byte[] keyBytes = new byte[16];
        System.arraycopy(key, 0, keyBytes, 0, Math.min(key.length, keyBytes.length));
        return keyBytes;
    }

    public Cipher getCipherEncrypt(final byte[] key) throws Exception {
        byte[] keyBytes = getKeyBytes(key);
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES");
        IvParameterSpec ivParameterSpec = new IvParameterSpec(keyBytes);
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
        return cipher;
    }

    public void encrypt(File in, File output, byte[] key) throws Exception {

        Cipher cipher = getCipherEncrypt(key);
        FileOutputStream fos = null;
        CipherOutputStream cos = null;
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(in);
            fos = new FileOutputStream(output);
            cos = new CipherOutputStream(fos, cipher);
            byte[] data = new byte[1024];
            int read = fis.read(data);
            while (read != -1) {
                cos.write(data, 0, read);
                read = fis.read(data);
             System.out.println(new String(data, "UTF-8").trim());

            }
            cos.flush();

        } finally {

            System.out.println("performed encrypt method now closing streams:\n" + output.toString());
            cos.close();
            fos.close();
            fis.close();


        }
    }


public void watchMeEncrypt(){

encrypt(file, new File ("example.txt),key);
Respuesta 1

Estoy tratando de entender cómo definir adecuadamente las interfaces en Java con respecto a cómo se tratan las excepciones en el lenguaje (y el tiempo de ejecución). NOTA: Quizás esta pregunta ya se haya hecho y ...

Tengo un conjunto como el siguiente: Set <Map.Entry <String, String >> set = new HashSet <> (); ¿Cómo puedo ordenar este conjunto en función de la clave de Map.Entry? Gracias.

Tengo un certificado y una clave privada que he recibido de diferentes lugares. Dado solo estos dos objetos abstractos, ¿puedo verificar que el Certificado está asociado o es el Certificado para ...

Configuramos nuestro nuevo micro servicio (usando Spring-Boot) de manera que la API oficial está en el puerto 8080 (que se asigna fuera de nuestra red virtual a HTTPS normal en el puerto 443), mientras que algunos ...