Аутентифицированное шифрование требует, чтобы мы использовали принятый стандарт для шифрования и аутентификации сообщения. Таким образом, мы оба шифруем сообщение и вычисляем MAC-адрес сообщения, чтобы убедиться, что он не был изменен.
Этот вопрос описывает способ усиления и шифрования ключей на основе пароля:
/* Derive the key, given password and salt. */
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(password, salt, 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
/* Encrypt the message. */
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret);
AlgorithmParameters params = cipher.getParameters();
byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
byte[] ciphertext = cipher.doFinal("Hello, World!".getBytes("UTF-8"));
Но насколько я могу судить, это не вычисляет какой-либо MAC на зашифрованном тексте и поэтому будет небезопасным. Каков приемлемый стандарт для выполнения аутентифицированного шифрования в Java?