Я публикую здесь решение, которое смог найти на случай, если кто-то столкнется с такой же проблемой в будущем.
На самом деле довольно легко зашифровать / расшифровать, используя размер блока Rijndael 256 с отступом PKCS7.объединяя два модуля rijndael-js
и pkcs7-padding
, которые доступны из реестра NPM.
rijndael-js
модуль позволяет шифровать / дешифровать с использованием блоков различных размеров: 128, 256 и 192 размера блоков - однако это толькоподдержка заполнения нулями.Поддержка дополнения PKCS7 не предоставляется.Поэтому вам нужно будет либо полагаться на другой модуль для заполнения PKCS7, либо сделать это самостоятельно (это тоже не сложно).
rijndael-js
будет только заполнять нулем открытый текст (данные, которые будут зашифрованы), еслиего длина не кратна размеру блока.Чтобы предотвратить заполнение ваших данных нулями, необходимо сначала заполнить открытый текст перед шифрованием.В приведенном ниже примере для этого я использую модуль pkcs7-padding
из npm.
nmp install rijndael-js pkcs7-padding --save
Это способ шифрования данных
const Rijndael = require('rijndael');
const padder = require('pkcs7-padding');
const crypto = require('crypto');
const plainText = Buffer.from('Here is my plain text', 'utf8');
//Pad plaintext before encryption
const padded = padder.pad(plainText, 32); //Use 32 = 256 bits block sizes
const key = crypto.randomBytes(32); //32 bytes key length
const iv = crypto.randomBytes(32); //32 bytes IV
const cipher = new Rijndael(key, 'cbc'); //CBC mode
const encrypted = cipher.encrypt(padded, 256, iv);
Это как расшифровать данные
const encrypted = ... //holds our encrypted data
const key = ... // holds our 32 bytes key
const iv = ... //holds our 32 bytes iv
const decipher = new Rijndael(key, 'cbc');
const decryptedPadded = decipher.decrypt(encrypted, 256, iv);
//Remember to un-pad result
const decrypted = padder.unpad(decryptedPadded, 32);
const clearText = decrypted.toString('utf8');
console.log(clearText); //-> Here is my plain text