Основном, что я хочу сделать, это вместо того, чтобы ключевой набор как
new byte[] { 'T', 'h', 'e', 'B', 'e', 's', 't', 'S', 'e', 'c', 'r','e', 't', 'K', 'e', 'y' };
Хорошо, потому что это страшно и небезопасно. Это худший секретный ключ. Пароли не являются ключами и не должны использоваться как таковые.
Я хочу, чтобы это было случайным (но должно быть 16 байт)
Вы хотите, чтобы это было безопасно случайно:
public static void main(final String ... args) throws Exception {
final SecureRandom prng = new SecureRandom();
final byte[] aes128KeyData = new byte[128/Byte.SIZE];
prng.nextBytes(aes128KeyData);
final SecretKey aesKey = new SecretKeySpec(aes128KeyData, "AES");
System.out.println(toHex(aesKey.getEncoded()));
}
private static String toHex(final byte[] data) {
final StringBuilder sb = new StringBuilder(data.length * 2);
for (final byte b : data) {
sb.append(String.format("%02X", b));
}
return sb.toString();
}
и иметь к нему доступ (печать это на экране).
См. Выше.
Кроме того, есть ли способ установить его как строку вместо байтового типа?
Ну, да, вы можете декодировать вышеупомянутую шестнадцатеричную строку. Но в итоге алгоритм AES требует двоичного ключа, двоичного открытого текста и генерирует двоичный вывод. Класс SecretKey
- это немного больше, чем обертка вокруг массива байтов.
Чтобы сделать больше конверсий и из строк, узнать о character-encoding и encoding ...
Вы можете получить массив байтов из строки, используя: «TheBestSecretKey» .getBytes («UTF-8»); вы можете создать случайную последовательность строк и получить байты одинаково. Проверьте ответ http://stackoverflow.com/questions/41107/how-to-generate-a-random-alpha-numeric-string – Cratylus
Я хочу получить строку из последовательности байтов, а не байта из строки. На самом деле я хочу, чтобы пользователь вводил ключ вместо того, чтобы быть IV (вектор инициализации). –
Это ужасный пример. Он будет использовать ECB, и он сбивает пароли с ключами. Не может быть намного хуже в нескольких строках. –