Created
December 20, 2019 15:07
-
-
Save ivaylopivanov/a1e27e7e1e3cc2263d5fa536ab66016b to your computer and use it in GitHub Desktop.
Javascript / Node AES encrypt / decrypt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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