Вам необходимо иметь IV, который не является предсказуемым для данного сообщения. Жесткое кодирование IV делает его предсказуемым. Таким образом, вам нужно найти способ передать IV с зашифрованным текстом. Хотя в отличие от ключа IV не нужно хранить в секрете.
Блочный шифр работает с блоком открытого текста фиксированного размера. Если у вас недостаточно открытого текста для ввода, он должен быть дополнен таким образом, чтобы получатель мог отличить заполнение от данных. Связанный пример полностью игнорирует это, и это ошибка. Если используется CipherOutputStream
, частичный конечный блок будет безболезненно обрезан из зашифрованного текста. Если объект Cipher
используется напрямую, частичный блок вызовет метод doFinal
для исключения. Вместо этого используйте что-то вроде PKCS5Padding.
Правильный пример Java будет примерно таким:
SecretKey secret = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret);
AlgorithmParameters param = cipher.getParameters();
/* In addition to ciphertext in "cos", recipient needs IV. */
byte[] iv = param.getParameterSpec(IvParameterSpec.class).getIV();
CipherOutputStream cos = new CipherOutputStream(output, cipher);
byte[] buf = new byte[2048];
while (true) {
int n = input.read(buf, 0, buf.length);
if (n < 0)
break;
cos.write(buf, 0, n);
}
cos.flush();
Где JSP получает открытый текст для шифрования? Как вы хотите, чтобы JSP форматировал вывод (включая IV)?