Le pregunté a esta pregunta hace un tiempo sobre las IV en AES, y Recibí una respuesta muy agradable y útil (¡gracias!), Así que pensé que quizás ustedes podrían ayudarme otra vez, esta vez con la generación clave real.
TL; DR - Ver la parte inferior
Actualmente, estoy encriptando así:
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
SecureRandom randomSecure = SecureRandom.getInstance("SHA1PRNG");
byte[] iv = new byte[cipher.getBlockSize()];
randomSecure.nextBytes(iv);
IvParameterSpec ivParams = new IvParameterSpec(iv);
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivParams);
rawCryptotext = cipher.doFinal(textToEncrypt.getBytes());
Como pueden ver, estoy usando la clase SecureRandom
para generar el IV aleatorio.
Sin embargo :
Observe la variable key
en la sexta línea de código:
SecretKeySpec skeySpec = new SecretKeySpec ( key .getBytes ("UTF-8"), "AES");
Esa variable proviene de mi método getKey()
, que es el siguiente:
public static String getKey()
{
String possibleKey = "init";
String validKey = null;
while (possibleKey.length() != 16)
{
System.out.printf("\nPlease enter a 128-bit key: ");
possibleKey = input.nextLine();
}
if (possibleKey.length() == 16)
{
validKey = possibleKey;
}
else
{
System.out.println("Something has gone very wrong...");
}
return validKey;
}
Notará que recibí la clave del usuario y la pasé en texto sin formato a SecretKeySpec
.