/*
See: https://code.google.com/archive/p/crypto-js/
https://code.google.com/archive/p/crypto-js/downloads
https://stackoverflow.com/questions/14958103/how-to-decrypt-message-with-cryptojs-aes-i-have-a-working-ruby-example
https://gist.github.com/marcoslin/8026990
http://sct9.blog85.fc2.com/blog-entry-62.html
https://fisproject.jp/2015/01/crypto-js-pycrypto-compatible/
*/
var encryption_encoded_key = 'U2FsdGVkX19nm8SCCdOk1RytPaIUvb2+Z7w+JfarEYo=';
var end_of_data_mark = '<EOD>';
function aes_encrypt(data) {
var key = CryptoJS.enc.Base64.parse(encryption_encoded_key).toString();
var key_hex = CryptoJS.enc.Hex.parse(key);
var iv_base64 = iv();
var iv_string = CryptoJS.enc.Base64.parse(iv_base64).toString();
var iv_hex = CryptoJS.enc.Hex.parse(iv_string);
data += end_of_data_mark;
var result = CryptoJS.AES.encrypt(data, key_hex, {
iv: iv_hex,
mode: CryptoJS.mode.CFB,
padding: CryptoJS.pad.NoPadding,
});
return Array(result.toString(), iv_base64);
}
function aes_decrypt(data, iv_base64) {
var key = CryptoJS.enc.Base64.parse(encryption_encoded_key).toString();
var key_hex = CryptoJS.enc.Hex.parse(key);
var iv_string = CryptoJS.enc.Base64.parse(iv_base64).toString();
var iv_hex = CryptoJS.enc.Hex.parse(iv_string);
var cipher = CryptoJS.lib.CipherParams.create({
ciphertext: CryptoJS.enc.Base64.parse(data),
});
var result = CryptoJS.AES.decrypt(cipher, key_hex, {
iv: iv_hex,
mode: CryptoJS.mode.CFB,
padding: CryptoJS.pad.NoPadding,
});
result = result.toString(CryptoJS.enc.Utf8).split(end_of_data_mark, 1)[0];
return result;
}
function iv() {
var rawStr = CryptoJS.lib.WordArray.random(128 / 16);
var wordArray = CryptoJS.enc.Utf8.parse(rawStr);
var base64 = CryptoJS.enc.Base64.stringify(wordArray);
return base64;
}
(function () {
var data = 'Hello world!';
var e = aes_encrypt(data);
var data = e[0];
var iv = e[1];
console.log('data = ' + data);
console.log('iv = ' + iv);
var d = aes_decrypt(data, iv);
console.log('data = ' + d);
})();