Мне нужно зашифровать строку, отправить 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






Не могли бы вы реализовать что-то вроде этого поста? 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);```
Поскольку вы не передаете 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 и получил ошибку: недопустимый вектор инициализации.
@ChumachenkoMihail Плохо, я думал, ты спрашивал о aes-128-ecb. Я обновил свой ответ.
Спасибо тебе, мужик! Вы мне очень помогли!
Я попытался скопировать ваш код без изменений, но он не работает (( также я пытался заменить ключевую строку на 16 символов, тот же результат Ошибка: ``` this[kHandle].initiv(cipher, credential, iv, authTagLength ); RangeError: Недопустимая длина ключа ```