GCMParameterSpe c или аналогичный для Android API от 16 до 18 - PullRequest
1 голос
/ 10 февраля 2020

Я хотел создать функцию для расшифровки зашифрованного сообщения aes-256-gcm nodejs

async decrypt_pw(password, key) {
    const key = 'secret';
    const pwBuffer = Buffer.from(password, 'hex');
    const authTag = pwBuffer.slice(-16);
    const iv = pwBuffer.slice(0, 12);
    const encryptedMessage = pwBuffer.slice(12, -16);
    const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv, { authTagLength: 16 });
    decipher.setAuthTag(authTag);
    let messagetext = decipher.update(encryptedMessage);
    messagetext = Buffer.concat([messagetext, decipher.final()]).toString();
    return messagetext;
}

При обращении к онлайн-решениям требуется GCMParameterSpe c, который является API 19 и выше.

GCMParameterSpec gcmSpec = new GCMParameterSpec(tagSize, new byte[gcm.getBlockSize()]);

Как я могу получить доступ к GCMParameter по API 16 или любой другой альтернативе для расшифровки aes-256-gcm?

1 Ответ

2 голосов
/ 10 февраля 2020

Давайте посмотрим на вашу инициализацию:

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.

...