AES 在 Cryptojs 中加密,在 Pycrypto 中解密

AES encrypt in Cryptojs, decrypt in Pycrypto

我在将密钥转换为 16 位时尝试了 md5 和 sha256,但加密后,如果我要通过第三方解密器验证它,结果不起作用 https://www.browserling.com/tools/aes-decrypt

我的目标是使用python解密js版本。

为 js 版本添加了另一个 link。 https://jsfiddle.net/korvacs/4obfkxm7/17/

Python代码:

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'))

有人可以帮助我吗?我不太擅长加密。

我正在使用 PBKDF2 生成 IV 和密钥。这是很好的做法。我们不需要转移 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")