enkripsi dengan crypto, dekripsi dalam crypto-js

Saya mencoba mendekripsi muatan terenkripsi yang ada di Postman. Enkripsi terjadi di nodejs seperti yang ditunjukkan di bawah ini. Saya tidak dapat mengubah enkripsi. Perhatikan bahwa payload adalah objek json yang juga dikodekan 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') }
}

Saya mencoba memecahkan kode lalu mendekripsi di Tukang Pos menggunakan crypto-js. Berikut adalah kode simulasi untuk melakukan itu:

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));

Saya mendapatkan kembali array byte tetapi bukan nilai yang diharapkan dalam teks biasa. Itu harus berupa objek json. Apakah saya melewatkan beberapa terjemahan pengkodean di suatu tempat? Bantuan apa pun dihargai.


person Mike Murray    schedule 18.05.2020    source sumber


Jawaban (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));

Itu berhasil untuk saya. Sejujurnya, ini sebagian besar hanya dugaan, saya kira fungsi decrypt secara implisit mengasumsikan bahwa ciphertext dalam hex dan Anda tidak perlu menguraikannya.

Ngomong-ngomong, tidak bisakah kamu menggunakan crypto.createDecipheriv saja? Saya pikir itu akan lebih sederhana, saya pikir Anda perlu menjalankannya di browser dan itulah mengapa Anda ingin menggunakan CryptoJS, tetapi Anda menggunakan Buffer.from dalam kode Anda. Meskipun itu dapat dengan mudah digantikan oleh atob() di lingkungan browser.

person paolostyle    schedule 18.05.2020
comment
Sepertinya saya melewatkan format sebagai bagian dari iv. Terima kasih banyak atas bantuannya. Saya menggunakan crypto.createDecipheriv saat mendekripsi di nodejs. Kasus penggunaan saya harus memecahkan kode di tukang pos jadi satu-satunya pilihan saya adalah menggunakan crypto-js dan perpustakaan itu tidak mendukung createDecipheriv. Saya dapat mengerjakan saran Anda - ini sangat membantu, terima kasih. - person Mike Murray; 19.05.2020