Kerwin
Kerwin

Reputation: 339

AES encrypt in Cryptojs, decrypt in Pycrypto

I've tried md5 and sha256 when converting key to 16 bit but after encrypting, the result doesnt work if I'm going to validate it via third party decryptor https://www.browserling.com/tools/aes-decrypt

My goal is to decrypt the js version using python.

Added another link for js version. https://jsfiddle.net/korvacs/4obfkxm7/17/

Python code:

from Crypto.Cipher import AES
from Crypto import Random
import hashlib
from base64 import b64encode

key = "lazydog".encode("utf-8")
key = hashlib.sha256(key).digest()

iv = Random.new().read(AES.block_size)
cipher = AES.new(key, AES.MODE_CBC, iv)
msg = iv + cipher.encrypt('Attack at dawn')

print(b64encode(msg).decode('utf-8'))

Can someone help me? I'm not really good in encryptions.

Upvotes: 1

Views: 3913

Answers (1)

Zergatul
Zergatul

Reputation: 2010

I am using PBKDF2 to generate IV and key. This is good practice. We don't need to transfer IV:

Javascript:

let password = "lazydog";
let salt = "salt";
let iterations = 128;
let bytes = CryptoJS.PBKDF2(password, salt, { keySize: 48, iterations: iterations });
let iv = CryptoJS.enc.Hex.parse(bytes.toString().slice(0, 32));
let key = CryptoJS.enc.Hex.parse(bytes.toString().slice(32, 96));

let ciphertext = CryptoJS.AES.encrypt("Attack at dawn", key, { iv: iv });
console.log(ciphertext.toString());
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.js"></script>

Python:

from base64 import b64decode
from Crypto.Cipher import AES
from Crypto.Protocol.KDF import PBKDF2 

data = b64decode("ibirgCQu8TwtJOaKKtMLxw==")

bytes = PBKDF2("lazydog".encode("utf-8"), "salt".encode("utf-8"), 48, 128)
iv = bytes[0:16]
key = bytes[16:48]
cipher = AES.new(key, AES.MODE_CBC, iv)
text = cipher.decrypt(data)
text = text[:-text[-1]].decode("utf-8")

Upvotes: 3

Related Questions