Попытка расшифровать зашифрованный ключ, сгенерированный с использованием алгоритма AES 256 (AES / ECB / PKCS7Padding) в nodejs с использованием шифрования - PullRequest
1 голос
/ 12 марта 2020

Я пытался использовать aes256, aes-cross и crypto. Но мне не удалось расшифровать ключ, который зашифрован с использованием AES 256 (aes-256-ecb) с отступом PKCS7. Я закончил со следующими упомянутыми ошибками.

Ошибка: Неверная длина ключа в Decipheriv.createCipherBase (или) Ошибка: Неверная длина IV в Decipheriv.createCipherBase

Я был не удалось найти пакет npm, который мне помогает.

Вот пример кода:

const crypto = require("crypto");
//Length of my key is 32
const key = Buffer.from("aaaaaabbbbbbccccccddddddssssssaa", "base64");
//_sek is the encrypted key
const _sek = "NEPkEuWaXZUawBHJZIcMjHJeKuPkaQezuRc3bjWEezlbHzmqCSyh2hazB+WeAJaU"
const cipher = crypto.createDecipheriv(
    "aes-256-ecb",
    Buffer.from(key, "base64"),
    Buffer.from([])
  );
  return cipher.update(_sek, "base64", "utf8") + cipher.final("utf8");

Если кто-нибудь может помочь мне с примером на основе кода в nodejs. Это поможет мне ясно понять.

Заранее спасибо.

1 Ответ

1 голос
/ 12 марта 2020

Ошибка Неверная длина ключа возникает, если длина ключа не соответствует указанному алгоритму. Например, в размещенном коде указан aes-256-ecb, который определяет AES-256, то есть AES с длиной ключа 32 байта. Однако используемый ключ имеет длину всего 24 байта, поскольку он Base64 декодируется при считывании в буфер. Это означает, что должен использоваться либо 32-байтовый ключ (например, если UTF-8 используется в качестве кодировки вместо Base64 при чтении в буфер), либо AES-192 (указанный как aes-192-ecb).

Недопустимая длина IV ошибка возникает, когда IV указан в режиме ECB (который вообще не использует IV), или когда в режиме, который использует IV, его длина не соответствует размеру блока алгоритма (например, 16 байтов для AES). Поскольку здесь используется режим ECB, просто введите null для IV (Buffer.from([]) тоже работает).

Пример с использованием AES-192 и 24-байтовой клавиши:

const crypto = require("crypto");

const key = "aaaaaabbbbbbccccccddddddssssssaa";
const secret = "01234567890123456789012345678901";

// Encryption
const cipher = crypto.createCipheriv("aes-192-ecb", Buffer.from(key, "base64"), null);
const encryptedSecret = cipher.update(secret, "utf8", "base64") + cipher.final("base64");
console.log(encryptedSecret);

// Decryption
const decipher = crypto.createDecipheriv("aes-192-ecb", Buffer.from(key, "base64"), null);
const decryptedSecret = decipher.update(encryptedSecret, "base64", "utf8") + decipher.final("utf8");
console.log(decryptedSecret);

Во время дешифрования в качестве выходного кодирования используется UTF-8, что, конечно, возможно только в том случае, если открытый текст совместим с этим, в противном случае необходимо применять подходящее кодирование, например Base64.

...