Rijndael 256 CBC PKCS7 Шифрование / дешифрование в NodeJS - PullRequest
0 голосов
/ 12 февраля 2019

Я создаю клиент NodeJS для службы, которая шифрует данные с использованием 256-битного блока Rijndael CBC с заполнением PKCS7.

Я рассмотрел несколько реализаций Rijndael в NodeJS, но ни одна из них не предлагает такую ​​комбинацию, котораяЯ ищу.

Любые рекомендации, как этого можно достичь в NodeJS?

1 Ответ

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

Я публикую здесь решение, которое смог найти на случай, если кто-то столкнется с такой же проблемой в будущем.

На самом деле довольно легко зашифровать / расшифровать, используя размер блока 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
...