encryptAes128Cbc = (plaintext, iv, key) => {
const BLOCK_SIZE = 16;
const ptBytes = lib.stob(plaintext)
const encKey = CryptoJS.enc.Utf8.parse(key);
const padded = lib.padBlock(ptBytes, BLOCK_SIZE);
const blocks = lib.chunkArr(padded, BLOCK_SIZE);
const xorZip = (a1, a2) => {
return a1.map((d, i) => d ^ a2[i]);
};
let lastBlock = iv;
let results = [];
for (let i = 0; i < blocks.length; i += 1) {
let prepped = xorZip(blocks[i], lastBlock);
let words = CryptoJS.enc.Base64.parse(lib.tob64(prepped));
let cipher = CryptoJS.AES.encrypt(words, encKey, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.NoPadding,
});
let cipherArr = lib.fromb64(CryptoJS.enc.Base64.stringify(cipher.ciphertext));
results.push(cipherArr);
lastBlock = cipherArr;
}
return lib.tob64(results.flat());
}