Ошибка при попытке шифрования с использованием алгоритма AES-128-ECB - PullRequest
0 голосов
/ 27 февраля 2019

Я пытался зашифровать некоторые сообщения, используя библиотеку «crypto» в NodeJS, и получаю следующую ошибку:

(узел: 31732) UnhandledPromiseRejectionWarning: Ошибка: ошибка: 0607F08A: процедуры цифрового конверта: EVP_EncryptFinal_ex: данные не кратны длине блока

в Cipheriv.final (внутренний / crypto / cipher.js: 164: 28)
в self.test (...)

self.test = async function(info, object) {
    let message = {
        info: info,
        object: object
    };

    let iv = crypto.randomBytes(16)
    let key = Buffer.from(config.key, 'utf8');
    let cipher = crypto.createCipheriv("aes-128-ecb", key, '');
    cipher.setAutoPadding(false)
    let encrypted = cipher.update(JSON.stringify(message));
    encrypted = Buffer.concat([iv, encrypted, cipher.final()]);
    encrypted = encrypted.toString('base64');

    console.log(encrypted);
}

Ошибка возникает из вызова cipher.final(), как видно из стека выше.

Я не могу понять, что говорит эта ошибка и как ее устранить.К сожалению, из-за ограничений (я пытаюсь отправить зашифрованные данные по UDP), я не могу использовать алгоритмы, такие как CBC (сообщения не принимаются в том же порядке, в котором они зашифрованы).

Любая помощь в значительной степениоценили!

1 Ответ

0 голосов
/ 27 февраля 2019

cipher.setAutoPadding(false) устанавливает для отступа значение false, а ECB и CBC работают только с полными блоками - вот почему заполнение требуется для всего, что не кратно размеру блока.Вы должны удалить строку (предпочтительно) или создать свой собственный отступ (и попасть в ловушку изобретения собственной криптографии).

Обратите внимание, что как ECB, так и CBC по своей природе уязвимы для атак оракулом открытого текста / отступов.В любом случае, ЕЦБ небезопасен и не использует IV.Для безопасности в транспортном режиме вам нужен MAC или вы должны использовать аутентифицированный шифр.Безопасность транспорта сложно реализовать, попробуйте DTLS.

...