micronyks
micronyks

Reputation: 55443

AES simple encryption in Node and decryption in Python and vice versa

I generate secretKey in nodejs as below,

const generateAesKey = () => {
    const { randomBytes } = require('node:crypto');

    randomBytes(32, (err, buf) => {
        if (err) throw err;
        return buf.toString('hex');
    });

}
const secretKey = generateAesKey(); 

SecretKey looks something like this : 491fb9719864f51e19a0705a3ef2de15cd91576d881cdc4bd4394bf7451ee404

Using above key, I encrypt and decrypt data as below (Node environment)

const CryptoJS = require("crypto-js");

// updated per Tppaco's comment
const secretKey = CryptoJS.enc.Hex.parse("491fb9719864f51e19a0705a3ef2de15cd91576d881cdc4bd4394bf7451ee404");                                  

const encrypt = (plainText) => {

    const iv = CryptoJS.enc.Utf8.parse('BBBBBBBBBBBBBBBB');
    const encrypted = CryptoJS.AES.encrypt(plainText, CryptoJS.enc.Utf8.parse(secretKey), {
        iv: iv,
        mode: CryptoJS.mode.CBC,
    });
    return encrypted.toString();

}

const decrypt = (cipherText) => {
    const iv = CryptoJS.enc.Utf8.parse('BBBBBBBBBBBBBBBB');
    const decrypted = CryptoJS.AES.decrypt(cipherText, CryptoJS.enc.Utf8.parse(secretKey), {
        iv: iv,
        mode: CryptoJS.mode.CBC,
    });
    return CryptoJS.enc.Utf8.stringify(decrypted);
}

const en = encrypt("Text to be encrypted");
console.log(decrypt(en))

I am able to encrypt/decrypt data successfully in Node environment. The problem comes when I have to decrypt data in Python environment that I encrypted in Node environment.

Python Environment

I have written below Python code which is equivalent Node code (correct me if this statement is not right).

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad,unpad
import base64
import json
import os
#CBC with Fix IV

# key = os.urandom(32)                                 // to generate random secret key

# updated per Tppaco's comment
key = bytes.fromhex('491fb9719864f51e19a0705a3ef2de15cd91576d881cdc4bd4394bf7451ee404')


data = 'Text to be encrypted'

#FIX IV
iv =  'BBBBBBBBBBBBBBBB'.encode('utf-8') #16 char for AES128

def encrypt(data,key,iv):
        data= pad(data.encode(),16)
        cipher = AES.new(key,AES.MODE_CBC,iv)
        return base64.b64encode(cipher.encrypt(data))

def decrypt(enc,key,iv):
        enc = base64.b64decode(enc)
        cipher = AES.new(key, AES.MODE_CBC, iv)
        return unpad(cipher.decrypt(enc),16)



def lambda_handler(event, context):
    
    encrypted = encrypt(data,key,iv)
    print('encrypted CBC base64 : ',encrypted.decode("utf-8", "ignore"))

    decrypted = decrypt(encrypted,key,iv)
    print('decrypted data: ', decrypted.decode("utf-8", "ignore"))
    return {
        'statusCode': 200,
        'decrypted text': json.dumps(decrypted.decode("utf-8", "ignore"))
    }

Error

"errorMessage": "Padding is incorrect.", "errorType": "ValueError",

My main purpose is to encrypt data in Node and decrypt it in Python. What am I doing wrong?

Upvotes: 0

Views: 116

Answers (0)

Related Questions