Проблема в том, что ваш конструктор на самом деле не конструктор, поэтому skey
, cipher
и другие закрытые члены никогда не инициализируются.
Конструкторы определены без возвращаемых типов, поэтому вам нужноизмените public void AES()
на public AES
.
Хорошо, очевидно, вы исправили эту проблему.Следующим является то, что cipher.init
не берет SecretKey
, а SecretKeySpec
.Работая с этого примера, который я нашел вам нужно что-то вроде:
byte[] raw = skey.getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
... и тогда вы можете передать skeySpec
, где вы в данный момент передаете skey
на cipher.init
.
Вперед, я полагаю, если только я не считаю неправильно, ваша проблема с этой строкой:
iv = cipher.getParameters().getParameterSpec(IvParameterSpec.class).getIV();
Если вы убедитесь, что cipher
не ноль, местав этой строке, которая может выдать NullPointerException
, после вызова getParameters()
или после вызова getParameterSpec()
.Вы можете легко определить, какой из этих вызовов вызывает исключение, разбив его на несколько строк и изучив трассировку стека ( вам следует посмотреть на трассировку стека и определить, где на самом деле генерируется исключение).
Если бы мне пришлось сделать ставку, я бы предположил, что cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
недействительно.Я подозреваю, что это сработало бы хорошо, если бы у вас было
cipher = Cipher.getInstance("AES");