python实现CryptoJS加密算法逆向

前言

最近在研究某网站参数过程中,发现前端使用crypto-js.js(AES算法)加密,对其深度研究,遇到很多坑,特简单记录一下。

AES简介

高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法。对称加密算法也就是加密和解密用相同的密钥.

AES 加密的参数

AES 加密主要有以下几个参数(坑):

  • key:加密的时候用秘钥,解密的时候需要同样的秘钥才能解出来。
  • word:需要加密的参数。
  • model:aes 加密常用的有 ECB 和 CBC 模式(我只用了这两个模式,还有其他模式)。
  • iv:偏移量 ,这个参数在 ECB 模式下不需要,在 CBC 模式下需要。
参数条件:

key:必须是16位字节或者24位字节或者32位字节
word:字节长度需要是16位的倍数

步骤

1、调试js,将具体实现加密的js代码抠出来
2、将js代码清洗简化,放在html中运行,即可实现整个加密过程
3、pip3安装pycrytodome库,实现同样的加密过程

crypto-js实现前端AES加密

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./crypto-js.js"></script>
</head>
<body>
    <div>我不显示,请查看console查看</div>
    <script>
        function Decrypt(word, keyStr) {
            let key = CryptoJS.enc.Utf8.parse('1234567890123456')
            let iv = CryptoJS.enc.Utf8.parse('1234567890123456')
            var decrypt = CryptoJS.AES.decrypt(word, key, {
                iv: iv,
                mode: CryptoJS.mode.CBC,
                padding: CryptoJS.pad.ZeroPadding
            })
            var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8)
            return decryptedStr.toString()
        }
        var pwd = '';
        pwd = Decrypt('wU/2oHphdJ5qzRQh9AltsQ==', '1234567890123456');
        console.log(pwd);
    </script>
</body>
</html>

python3实现AES加密

# coding:utf-8

from Crypto.Cipher import AES
import base64
class AesCrypt():
    def __init__(self, key, model, iv):
        self.model = {'ECB': AES.MODE_ECB, 'CBC': AES.MODE_CBC}[model]
        self.key = self.add_16 (key)
        self.iv = iv.encode ()
        if model == 'ECB':
            self.aes = AES.new (self.key, self.model)  # 创建aes对象
        elif model == 'CBC':
            self.aes = AES.new (self.key, self.model, self.iv)  # 创建aes对象

    def add_16(self,par):
    	# python3字符串是unicode编码,需要 encode才可以转换成字节型数据
        par = par.encode('utf-8')
        while len(par) % 16 != 0:
            par += b'\x00'
        return par

    def aesdecrypt(self, text):
        # CBC解密需要重新创建一个aes对象
        if self.model == AES.MODE_CBC:
            self.aes = AES.new(self.key, self.model, self.iv)
        text = base64.decodebytes(text.encode('utf-8'))
        self.decrypt_text = self.aes.decrypt(text)
        return self.decrypt_text.decode('utf-8').strip('\0')

if __name__ == '__main__':
    key = '1234567890123456'
    iv = '1234567890123456'
    word = 'wU/2oHphdJ5qzRQh9AltsQ=='
    model = 'CBC'
    pr = AesCrypt(key,model,iv)
    print (pr.aesdecrypt (word))

以上即可实现和crypto-js同样结果。

可能有同学会问,为什么不使用execjs,我第一个想到的就是execjs直接运行js代码,但是会提示无法找到crypto-js,因此放弃

### 对Python源代码进行加密的方法 对于希望保护Python源代码不被轻易查看或修改的需求,有多种方法可供选择。一种常见的做法是利用编译技术将Python脚本转换为字节码或者二进制形式,从而提高反向工程的难度。 #### 使用PyInstaller打包并隐藏源代码 PyInstaller能够把Python应用程序及其依赖项冻结到单个可执行文件中[^4]。通过这种方式发布的程序不会暴露原始.py文件给最终用户: ```bash pip install pyinstaller pyinstaller --onefile your_script.py ``` 这不仅简化了分发过程,而且使得访问实际源代码变得更加困难。然而需要注意的是,虽然这种方法能有效阻止一般用户的窥探,但对于经验丰富的开发者来说仍然存在逆向的可能性。 #### 利用Cython实现更深层次的安全性 为了进一步增强安全性,可以考虑采用Cython来编译Python代码至C语言再生成共享库(.so/.dll),这样即使有人获得了编译后的产物也难以还原出完整的逻辑结构[^2]。具体操作如下所示: 1. 将`.pyx`扩展名赋予待处理的模块; 2. 编写相应的setup.py配置安装指令; 3. 运行构建命令完成整个流程。 ```python from distutils.core import setup from Cython.Build import cythonize setup(ext_modules=cythonize("your_module.pyx")) ``` #### 加密字符串和其他敏感数据 如果只是想对某些特定变量比如API key、数据库连接串之类的机密信息实施简单加密,则可以直接引入第三方类库如CryptoJS AES算法,在运行时动态解密所需内容[^3]。不过这种方案仅适用于少量固定文本,并不适合整体项目层面的应用场景。 综上所述,针对不同层次的要求有不同的解决方案可以选择。对于大多数情况而言,结合以上几种手段往往可以获得较为满意的防护效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值