For some reason, I use the node-forge
to do the encryption and decryption, and now, I need use the crypto-js
to do the decryption(postman and apifox only support this). But the encrypted result cannot be decrypted by crypto-js
, and this value can be decrypted by other online encryption tools.
Here are some example codes.
const CryptoJS = require('crypto-js')
const forge = require("node-forge")
function randomIV() {
return forge.util.bytesToHex(forge.random.getBytesSync(16))
}
function forge_encrypt(key, iv, plaintext) {
const cipher = forge.cipher.createCipher("AES-CBC", key);
cipher.start({ iv: iv });
cipher.update(forge.util.createBuffer(plaintext, "utf8"));
cipher.finish();
const encrypted = cipher.output;
const encryptedData = encrypted.toHex();
return encryptedData;
}
function forge_decrypt(key, iv, encryptedText) {
var decipher = forge.cipher.createDecipher("AES-CBC", key);
decipher.start({ iv: iv });
decipher.update(forge.util.createBuffer(forge.util.hexToBytes(encryptedText)));
var result = decipher.finish();
if (!result) {
console.log("decrypted failed,", encryptedText)
}
console.log(decipher.output.toString())
}
function crypto_decrypt(key, iv, encryptedData) {
key = CryptoJS.enc.Utf8.parse(key);
iv = CryptoJS.enc.Hex.parse(iv);
const bytes = CryptoJS.enc.Hex.parse(encryptedData);
const decrypted = CryptoJS.AES.decrypt({ ciphertext: bytes }, key, { iv: iv, mode: CryptoJS.mode.CBC })
console.log(decrypted)
// var decryptedText = decrypted.toString();
console.log("->", decrypted.toString(CryptoJS.enc.Utf8));
}
const key = "abcdefghijklmnop"
const iv = "fef23eb7c7c8bf3015dfe9a3c5cc4d07" // got from randomIV()
const data = `{"code":0,"data":{}}`
var encrypted = forge_encrypt(key, iv, data)
console.log(encrypted)
console.log("----forge_decrypt----")
forge_decrypt(key, iv, encrypted)
console.log("----crypto_decrypt----")
crypto_decrypt(key, iv, encrypted) // decrypt failed
Any idea why the decryption fails?