Skip to content

Instantly share code, notes, and snippets.

@ivaylopivanov
Created December 20, 2019 15:07
Show Gist options
  • Save ivaylopivanov/a1e27e7e1e3cc2263d5fa536ab66016b to your computer and use it in GitHub Desktop.
Save ivaylopivanov/a1e27e7e1e3cc2263d5fa536ab66016b to your computer and use it in GitHub Desktop.
Javascript / Node AES encrypt / decrypt
let CryptoJS = require("crypto-js");
let message = '{"wifi":"wtf","password":"ABCDEFG1", "timestamp": "1234566"}';
let password = '~NB8CcOL#J!H?|Yr';
function decodeToString(string) {
return CryptoJS.enc.Base64.parse(string).toString(CryptoJS.enc.Utf8);
}
function decodeToHex(string) {
return CryptoJS.enc.Base64.parse(string).toString(CryptoJS.enc.Hex);
}
function encode(string) {
return CryptoJS.enc.Utf8.parse(string).toString(CryptoJS.enc.Base64);
}
function parseToHex(string) {
return CryptoJS.enc.Utf8.parse(string).toString(CryptoJS.enc.Hex);
}
function decrypt(message, key, iv) {
let ivEX = CryptoJS.enc.Hex.parse(decodeToHex(iv));
let keyEX = CryptoJS.enc.Hex.parse(parseToHex(key));
let bytes = CryptoJS.AES.decrypt(message, keyEX , { iv: ivEX});
let plaintext = bytes.toString(CryptoJS.enc.Base64);
// return decodeToString(plaintext)
return decodeToString(decodeToString(plaintext));
}
function decryptFromGo(message, key, iv) {
let ivEX = CryptoJS.enc.Hex.parse(decodeToHex(iv));
let keyEX = CryptoJS.enc.Hex.parse(parseToHex(key));
let bytes = CryptoJS.AES.decrypt(message, keyEX , { iv: ivEX});
let plaintext = bytes.toString(CryptoJS.enc.Base64);
return decodeToString(plaintext)
// return decodeToString(decodeToString(plaintext));
}
function encrypt(message, key) {
let keyHex = CryptoJS.enc.Hex.parse(parseToHex(key))
let iv = CryptoJS.lib.WordArray.random(128 / 8);
let wordArray = CryptoJS.enc.Utf8.parse(message);
let base64 = CryptoJS.enc.Base64.stringify(wordArray);
let encrypted = CryptoJS.AES.encrypt(base64, keyHex, { iv: iv });
// let encrypted = CryptoJS.AES.encrypt(wordArray, keyHex, { iv: iv });
return {
cipher: encrypted.ciphertext.toString(CryptoJS.enc.Base64),
iv: CryptoJS.enc.Base64.stringify(iv),
// length: base64.length,
size: encrypted.ciphertext.sigBytes,
}
}
let result = encrypt(message, password);
console.log(result);
var decrypted = decrypt(result.cipher, password, result.iv);
console.log("Own", decrypted);
var esp8266_msg = 'e+7ppAHhvwc+S1bZPDEz24qoWYuLULUdpfrBgSoe+Z3ODcqLccOGTzod8qOAa0HweWez1DqMy5jq77rfMFRmk5qEAe9TE8MjBwEcsxKsUh4=';
var esp8266_iv = '4n4oQTBFZWA7p8g3hwltpg==';
var decrypted = decrypt(esp8266_msg, password, esp8266_iv);
console.log("ESP", decrypted);
var go_msg = 'LEFVmxbguQhVJGGvbhdozr0PNTWBr5nZArrTCtGp1gkWVzWZEyxUDv+W5H0/Ra2S9STuAlf8QEHxdV4WcatdHg==';
var go_iv = 'j2GVXSXXn4o6SXyqk8radw==';
var decrypted = decryptFromGo(go_msg, password, go_iv);
console.log("GO", decrypted);
@ratemyteamin
Copy link

ratemyteamin commented Nov 1, 2021

Can you please tell me how you are encrypting in Go?

I tried doing this way but its failing in decrypt
RangeError: Invalid array length in line 36

decodedIv, err := base64.StdEncoding.DecodeString(IV)
if err != nil {
return "", err
}
newCipher, err := aes.NewCipher([]byte(key))
if err != nil {
return "", err
}
cfbdec := cipher.NewCFBEncrypter(newCipher, decodedIv)
ciphertext := make([]byte, aes.BlockSize+len(jsonString))
cfbdec.XORKeyStream(ciphertext[aes.BlockSize:], jsonString)
return base64.URLEncoding.EncodeToString(ciphertext), nil

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment