Ho chiesto questa domanda qualche tempo fa su IVs in AES, e Ho avuto una risposta molto gentile e utile (grazie!), Quindi stavo pensando che forse voi ragazzi potreste aiutarmi di nuovo, questa volta con la vera generazione di chiavi.
TL; DR - Vedi in basso
Attualmente sto crittografando in questo modo:
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());
Quindi puoi vedere che sto usando la classe SecureRandom
per generare il IV casuale.
Tuttavia:
Notare la variabile key
nella sesta riga di codice:
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
Quella variabile proviene dal mio metodo getKey()
, che è la seguente:
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;
}
Noterai che ottengo la chiave da parte dell'utente e la passo in testo normale a SecretKeySpec
.