Как расшифровать строку в nodejs, зашифрованную в php с помощью алгоритма aes-128-cbc?

Мне нужно зашифровать строку, отправить http-запрос с этой зашифрованной строкой, а затем расшифровать ее на сервере nodejs.

Сторона PHP:

$var  = openssl_encrypt('string', "aes-128-cbc", 'stringstringstri');

Сторона узла:

let decipher = crypto.createDecipher('aes-128-cbc', 'stringstringstri');
let decrypted = decipher.update(encrypted, 'utf8', 'utf8') + decipher.final('utf8');

также пытался

const initVector = crypto.randomBytes(32);
const decipher = crypto.createDecipheriv('aes-128-cbc', 'stringstringstri', initVector)
let decryptedData = decipher.update(encrypted, 'utf8', 'utf-8')
decryptedData += decipher.final('utf-8');

и получил ошибку: wrong final block length или this[kHandle].initiv(cipher, credential, iv, authTagLength); TypeError: Invalid initialization vector

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Не могли бы вы реализовать что-то вроде этого поста? https://ashish-dhodare.medium.com/implementing-aes-cbc-encryption-in-node-js-java-and-c-cross-language-encryption-42d1844119b9


function encrypt(plainString, AesKey, AesIV) {
    const cipher = crypto.createCipheriv("aes-128-cbc", AesKey, AesIV);
    let encrypted = Buffer.concat([cipher.update(Buffer.from(plainString, "utf8")), cipher.final()]);
    return encrypted.toString("base64");
}

function decrypt(base64String, AesKey, AesIV) {
    const decipher = crypto.createDecipheriv("aes-128-cbc", AesKey, AesIV);
    const deciphered = Buffer.concat([decipher.update(Buffer.from(base64String, "base64")), decipher.final()]);
    return deciphered.toString("utf8");
}

// const key = crypto.randomBytes(32); //Need 32 bytes (256 bits) key as we are using AES-256 encryption
const key = Buffer.from("J/PYjc1ftDFK5+77U1PB80v2TamokGap5yCIP2YI6tQ = ", "base64");
// const iv = crypto.randomBytes(16); //Need 16 bytes (128 bits) Initialization vector as default block size is 128 bits
const iv = Buffer.from("gaOr3uvhZEwFeSbRHwlHcg= = ", "base64");

// Its better to pass iv and key in bytes/buffer
var encryptedData = encrypt("some data to encrypt", key, iv);
console.info(encryptedData);
// Need same key and iv for decryption otherwise it won't work
var decryptedData = decrypt(encryptedData, key, iv)
console.info(decryptedData);```

Я попытался скопировать ваш код без изменений, но он не работает (( также я пытался заменить ключевую строку на 16 символов, тот же результат Ошибка: ``` this[kHandle].initiv(cipher, credential, iv, authTagLength ); RangeError: Недопустимая длина ключа ```

Chumachenko Mihail 01.02.2023 20:08
Ответ принят как подходящий

Поскольку вы не передаете iv в PHP, используется значение по умолчанию iv, которое является пустой строкой. Следовательно, вам нужно учитывать это и в Node.js.

Итак, изменения будут такими:

const key = 'string';
const cipher = crypto.createDecipheriv('aes-128-cbc', key, Buffer.alloc(16));
const cipherEncrypted = Buffer.from(encrypted, 'base64');
const decrypted = Buffer.concat([cipher.update(cipherEncrypted), cipher.final()]);
console.info(decrypted.toString());

Я попробовал этот фрагмент, но изменил ваш ключ «aes-128-ecb» на «aes-128-cbc»: elonmuskelonmusk и получил ошибку: недопустимый вектор инициализации.

Chumachenko Mihail 01.02.2023 20:25

@ChumachenkoMihail Плохо, я думал, ты спрашивал о aes-128-ecb. Я обновил свой ответ.

Mostafa Fakhraei 01.02.2023 21:02

Спасибо тебе, мужик! Вы мне очень помогли!

Chumachenko Mihail 01.02.2023 21:27

Другие вопросы по теме