зашифровать с помощью криптографии, расшифровать с помощью крипто-js

Я пытаюсь расшифровать существующую зашифрованную полезную нагрузку в Postman. Шифрование происходит в nodejs, как показано ниже. Я не могу изменить шифрование. Обратите внимание, что полезная нагрузка представляет собой объект json, который также закодирован в base64:

import crypto from 'crypto'

export const encrypt = (text: any, key: string, iv: any) => {
    const cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(key), iv)
    let encrypted = cipher.update(text)
    encrypted = Buffer.concat([encrypted, cipher.final()])
    return { iv: iv.toString('hex'), encryptedData: encrypted.toString('hex') }
}

Я пытаюсь декодировать, а затем расшифровать в Postman, используя crypto-js. Вот смоделированный код для этого:

var crypto = require("crypto-js");

var payload = 'eyJpdiI6ImFhMzAxYmQwYjE0ODNiZTQ3ZGIzNGZkYWMzYzZjZGNmIiwiZW5jcnlwdGVkRGF0YSI6IjYzNDUwYjdmNTBmM2I3Y2MyN2UwYmQ5MjlmMjRkNTZmZTFkY2Y4M2I3YjM3MjYxZDE4ZmJkMTc2YWUzZjU2ZTZiYmE3ZjcxNmQ0MWFlNGIxYWEwMTY3NjI4OTEyNjAwYjYwMzc5MmJhNmI4MWRjZTk4ZTQ2NDkxYjNjOGNhYmU5NDVjOWQ1ZDM4MzUzNGY5NWIwNDljYTM1Y2VlZjA2YTMyOTRkNzY2YjVjZDE3MTlmYjAxMTgzZjkyNWNhODFiM2UwOTM2NTUyNzVjYWU2M2JlMTE0Y2JjYTU0NmNiMjc2ODY0N2ZkYzc2YjRkYzJiMDk3ZjExMDQzNDI2OGE1ZGY3ZDVkZjYwYTVkZjZlMzg0NWIyMzYzNWIxNTVhYTRiZjU5MzU0OTFkYjY3ZWZjYjZhMjM4YTVkNDg5YzAxMDExMGU1NGE5ODc0MDE1MjQxZjJmZmY4ZDNhNmM1OWI5MjhhMzFlYWI4ZjA3M2ZlZGFlMjIxZWVjNWY4ZWM5MDRmMyJ9'

var decodedPayload = Buffer.from(payload, 'base64').toString('utf8');
console.log('decoded: ', decodedPayload);
var parsedPayload = JSON.parse(decodedPayload);
var iv = parsedPayload.iv;
var crypttext = parsedPayload.encryptedData;
console.log('iv: ', iv);
console.log('crypttext: ', crypttext);
var key = 'fpK92jhnf914Kahqkecnml96l4apmgOf';
var plaintextArray = CryptoJS.AES.decrypt(
    {
        ciphertext: CryptoJS.enc.Hex.parse(crypttext),
        salt: ''
    },
    Buffer.from(key),
    { iv: CryptoJS.enc.Hex.parse(iv), mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.NoPadding }
)
console.log('plaintextArray: ', plaintextArray);
console.log('res: ', CryptoJS.enc.Hex.stringify(plaintextArray));

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


person Mike Murray    schedule 18.05.2020    source источник


Ответы (1)


const CryptoJS = require('crypto-js');

const payload = 'eyJpdiI6ImFhMzAxYmQwYjE0ODNiZTQ3ZGIzNGZkYWMzYzZjZGNmIiwiZW5jcnlwdGVkRGF0YSI6IjYzNDUwYjdmNTBmM2I3Y2MyN2UwYmQ5MjlmMjRkNTZmZTFkY2Y4M2I3YjM3MjYxZDE4ZmJkMTc2YWUzZjU2ZTZiYmE3ZjcxNmQ0MWFlNGIxYWEwMTY3NjI4OTEyNjAwYjYwMzc5MmJhNmI4MWRjZTk4ZTQ2NDkxYjNjOGNhYmU5NDVjOWQ1ZDM4MzUzNGY5NWIwNDljYTM1Y2VlZjA2YTMyOTRkNzY2YjVjZDE3MTlmYjAxMTgzZjkyNWNhODFiM2UwOTM2NTUyNzVjYWU2M2JlMTE0Y2JjYTU0NmNiMjc2ODY0N2ZkYzc2YjRkYzJiMDk3ZjExMDQzNDI2OGE1ZGY3ZDVkZjYwYTVkZjZlMzg0NWIyMzYzNWIxNTVhYTRiZjU5MzU0OTFkYjY3ZWZjYjZhMjM4YTVkNDg5YzAxMDExMGU1NGE5ODc0MDE1MjQxZjJmZmY4ZDNhNmM1OWI5MjhhMzFlYWI4ZjA3M2ZlZGFlMjIxZWVjNWY4ZWM5MDRmMyJ9';
const key = 'fpK92jhnf914Kahqkecnml96l4apmgOf';

function decrypt(b64payload, key) {
  const decodedData = Buffer.from(b64payload, "base64").toString("utf8");
  const { iv, encryptedData } = JSON.parse(decodedData);

  return CryptoJS.AES.decrypt(encryptedData, CryptoJS.enc.Utf8.parse(key), {
    iv: CryptoJS.enc.Hex.parse(iv),
    mode: CryptoJS.mode.CBC,
    format: CryptoJS.format.Hex,
  }).toString(CryptoJS.enc.Utf8);
}

console.log(decrypt(payload, key));

Это сработало для меня. Честно говоря, это были в основном догадки, я полагаю, что функция decrypt неявно предполагает, что зашифрованный текст находится в шестнадцатеричном формате, и вам не нужно его анализировать.

Кстати, нельзя было просто использовать crypto.createDecipheriv? Я думаю, что это было бы проще, я думал, что вам нужно запустить его в браузере, и поэтому вы хотели использовать CryptoJS, но вы использовали Buffer.from в своем коде. Хотя это можно легко заменить на atob() в среде браузера.

person paolostyle    schedule 18.05.2020
comment
Похоже, мне не хватало формата как части iv. Большое спасибо за помощь. Я использую crypto.createDecipheriv при расшифровке в nodejs. Мой вариант использования — декодирование в почтальоне, поэтому мой единственный вариант — использовать crypto-js, и эта библиотека не поддерживает createDecipheriv. Я могу работать с вашим предложением - это большая помощь, спасибо. - person Mike Murray; 19.05.2020