js中的aes加密的python实现

最近遇到个加密,js中很简单的aes加密,但是python实现的时候发现解密结果不太对,找了一些,最终是找到了,这里记录下;

js的加密很简单是这样的

CryptoJS.AES.encrypt(e, n).toString()

而且结果是不停地变动的,找了一些在线加密的网站,发现有的加密完跟这个是一样的,有些是加密完不变的,尝试调整了模式,都不对,其实base64对数据进行解码的时候发现了前面的明文,但是当时没有太在意,绕了好多路;

解码的前面摘的字符串Salted__鑌B&fٯ;վ ,有经验的大佬应该已经看出来了,salted,加盐嘛;

以下是python的实现:

# __*__ coding=utf-8 __*__
import base64
from hashlib import md5
from Crypto import Random
from Crypto.Cipher import AES


# AES加解密封装
class AESTool(object):

    # pad 填充
    @staticmethod
    def pad(text):
        length = 16 - (len(text) % 16)
        return (text + chr(length) * length).encode()

    @staticmethod
    def un_pad(data):
        return data[:-(data[-1] if type(data[-1]) == int else ord(data[-1]))]

    # 获得key和iv key32 iv16
    @staticmethod
    def get_key_iv(text, salt, output=48):
        assert len(salt) == 8, len(salt)
        text = text.encode() + salt
        key = md5(text).digest()
        final_key = key
        while len(final_key) < output:
            key = md5(key + text).digest()
            final_key += key
        return final_key[:output]

    # 加密
    def encrypt(self, message, secret):
        salt = Random.new().read(8)
        key_iv = self.get_key_iv(secret, salt, 32 + 16)
        key = key_iv[:32]
        iv = key_iv[32:]
        aes = AES.new(key, AES.MODE_CBC, iv)
        encrypt_data = aes.encrypt(self.pad(message))
        return base64.b64encode(b"Salted__" + salt + encrypt_data).decode()

    # 解密
    def decrypt(self, encrypt_data, secret):
        encrypted = base64.b64decode(encrypt_data)
        assert encrypted[0:8] == b"Salted__"
        salt = encrypted[8:16]
        key_iv = self.get_key_iv(secret, salt, 32 + 16)
        key = key_iv[:32]
        iv = key_iv[32:]
        aes = AES.new(key, AES.MODE_CBC, iv)
        return self.un_pad(aes.decrypt(encrypted[16:])).decode()




if __name__ == '__main__':
    obj = AESTool()
    a = ''
    s = ''
    print(obj.decrypt(a,s))

你可能感兴趣的:(python,javascript,开发语言,爬虫)