Давайте посмотрим на вашу инициализацию:
const iv = pwBuffer.slice(0, 12);
...
const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv, { authTagLength: 16 });
и GCMParameterSpec
параметры:
GCMParameterSpec(int tLen, byte[] src)
Здесь tLen
- длина тега в битах, поэтому она authTagLength * 8
, он должен иметь 128-битное значение.
Плохо названный параметр src
предназначен для IV и поэтому идентичен вашему параметру iv
, который в коде составляет 12 байт.
К счастью, 96-битный IV (точнее одноразовый) и 128-битный тег аутентификации являются значениями по умолчанию для GCM . Таким образом, вы можете просто использовать:
new IvParameterSpec(iv)
в вашем Android коде. Это было стандартной практикой до тех пор, пока GCMParameterSpec
не может быть использован для добавления опции конфигурации размера тега аутентификации.
Для других читателей: если IV равен , а не 12 байтов, то у вас сначала есть чтобы проверить, поддерживает ли реализация GCM значения IV различного размера.
Если тег аутентификации короче (он должен находиться в диапазоне от 32 бит до 128 бит с шагом 8 бит, с 96-128 относительно безопасным), тогда проверка выполняется произойдет сбой для Java - похоже, нет способа извлечь вычисленный тег аутентификации за пределы зашифрованного текста. Так что в этом случае вы должны перейти к циклам и получить другую реализацию, которая не использует Cipher
.