Edit:
Как написано в комментариях, старый код не является «лучшей практикой».
Вы должны использовать алгоритм генерации ключей, такой как PBKDF2, с большим количеством итераций.
Вы также должны использовать хотя бы частично нестатическую (то есть для каждой исключительной «идентичности») соль. По возможности генерируется случайным образом и сохраняется вместе с зашифрованным текстом.
SecureRandom sr = SecureRandom.getInstanceStrong();
byte[] salt = new byte[16];
sr.nextBytes(salt);
PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 1000, 128 * 8);
SecretKey key = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1").generateSecret(spec);
Cipher aes = Cipher.getInstance("AES");
aes.init(Cipher.ENCRYPT_MODE, key);
===========
Старый ответ
Вы должны использовать SHA-1, чтобы сгенерировать хеш из вашего ключа и обрезать результат до 128 бит (16 байт).
Кроме того, не генерируйте байтовые массивы из строк через getBytes () он использует Charset по умолчанию для платформы. Таким образом, пароль «blaöä» приводит к разным байтовым массивам на разных платформах.
byte[] key = (SALT2 + username + password).getBytes("UTF-8");
MessageDigest sha = MessageDigest.getInstance("SHA-1");
key = sha.digest(key);
key = Arrays.copyOf(key, 16); // use only first 128 bit
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
Edit:
Если вам нужны ключи размером 256 бит, вам необходимо загрузить «Файлы политики неограниченной юрисдикции расширения Java Cryptography Extension (JCE)» Ссылка для скачивания Oracle , использовать SHA-256 в качестве хэша и удалить массивы . copyOf line.
«ECB» - это режим шифрования по умолчанию, а «PKCS5Padding» - заполнение по умолчанию.
Вы можете использовать различные режимы шифрования и режимы заполнения через строку Cipher.getInstance , используя следующий формат: "Cipher / Mode / Padding"
Для AES с использованием CTS и PKCS5Padding строка выглядит так: «AES / CTS / PKCS5Padding»