首页 > 编程语言 >AES---JS加密python解密

AES---JS加密python解密

时间:2023-03-07 10:11:34浏览次数:56  
标签:AES 加密 python self 解密 JS key iv data

一. AES加密解密
1.AES-128-CBC
Zero:数据长度不足时填充0,如果数据长度刚好合适就不填充
PKCS5:填充8字节长度的ASCII码编号为8的字符
PKCS7:(1) 数据如果长度刚好合适,就填充数据长度的字节,填充数据为ASCII码编号为数据长度的字符
​ (2)数据长度如果没对齐,则差n长度,就补充n长度的ASCII码编号为n的字符

分析
1.前端参数
在这里插入图片描述
2.前端逻辑分析

  • key秘钥采用随机数生成16为字符,然后通过Crypto.enc.UTF8.parse解析成需要的key
  • iv偏移量采用key进行MD5加密后取前16个字符作为偏移量
  • AES加密后的数据最后再base64加密后显现的
  • 数据传输时加密把key和加密后的数据传到后端

3.后端参数
在这里插入图片描述
4.后端逻辑分析

  • 拿到随机的key字符串,然后转化为MD5,取前面16个字符作为偏移量iv
  • 将前端传来的加密数据先base64解密为需要AES解密的数据
  • AES解密,key,iv都时字符串
  • 不同的数据填充方式,获取的最后解密的数据是不同的,需要根据不同的数据填充方式转化为最终我们需要的前端原始未加密的字符串
js前端实现加密

// n位随机数生成
function randomNum(n) {
    let sString = "";
    let strings = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    for (i = 0; i < n; i++) {
        ind = Math.floor(Math.random() * strings.length);
        sString += strings.charAt(ind);
    }
    return sString
}

//AES-128-CBC-ZeroPadding加密
function encrypt(data, key) {
    iv = CryptoJS.MD5(key).toString().substring(0, 16);  //取转化为md5格式的前面16位字符
    key = CryptoJS.enc.Utf8.parse(key);  //解析后的key
    iv = CryptoJS.enc.Utf8.parse(iv); //解析后的iv
    encrypted = CryptoJS.AES.encrypt(data, key, { //j加密
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.ZeroPadding
    });
    return encrypted.toString()

}
python后端解密

import base64
import hashlib
from Crypto.Cipher import AES, DES
class DeAesCrypt:
    """
    AES-128-CBC解密
    """
    
    def __init__(self, data, key, pad):
        """
        :param data: 加密后的字符串
        :param key: 随机的16位字符
        :param pad: 填充方式
        """
        self.key = key
        self.data = data
        self.pad = pad.lower()

        hash_obj = hashlib.md5()  # 构造md5对象
        hash_obj.update(key.encode())  # 进行md5加密,md5只能对byte类型进行加密
        res_md5 = hash_obj.hexdigest()  # 获取加密后的字符串数据
        self.iv = res_md5[:16]

    @property
    def decrypt_aes(self):
        """AES-128-CBC解密"""
        real_data = base64.b64decode(self.data)
        my_aes = AES.new(self.key, AES.MODE_CBC, self.iv)

        decrypt_data = my_aes.decrypt(real_data)
        return self.get_str(decrypt_data)

    def get_str(self, bd):
        """解密后的数据去除加密前添加的数据"""
        if self.pad == "zero":  # 去掉数据在转化前不足16位长度时添加的ASCII码为0编号的二进制字符
            return ''.join([chr(i) for i in bd if i != 0 ])
        
        elif self.pad == "pkcs7":  # 去掉pkcs7模式中添加后面的字符
            return ''.join([chr(i) for i in i > 32])  #  此处报错,在我环境
        
        else:
            return "不存在此种数据填充方式"

 

二、 DES加密解密
1.DES-128-CBC模式
分析
1)前端参数
在这里插入图片描述2)前端逻辑分析

  • key秘钥采用随机数生成8为字符,然后通过Crypto.enc.UTF8.parse解析成需要的key
  • iv偏移量采用key进行base64加密后取前8个字符作为偏移量
  • DES加密后的数据最后再base64加密后显现的
  • 数据传输时加密把key和加密后的数据传到后端

3)后端参数
在这里插入图片描述
4.后端逻辑分析

  • 拿到随机的key字符串,然后转化为base64,取前面8个字符作为偏移量iv
  • 将前端传来的加密数据先base64解密为需要DES解密的数据
  • DES解密,key,iv都时字符串
  • 不同的数据填充方式,获取的最后解密的数据是不同的,需要根据不同的数据填充方式转化为最终我们需要的前端原始未加密的字符串
js前端实现加密

// n位随机数生成
function randomNum(n) {
    let sString = "";
    let strings = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    for (i = 0; i < n; i++) {
        ind = Math.floor(Math.random() * strings.length);
        sString += strings.charAt(ind);
    }
    return sString
}

// DES-128-CBC-Zero-crypt
function desZeroEncrypt(data, key) {
    let iv = CryptoJS.enc.Utf8.parse(key);
    iv = CryptoJS.enc.Base64.stringify(iv).toString().substring(0,8);//base64加密取前8位
    iv = CryptoJS.enc.Utf8.parse(iv);
    key = CryptoJS.enc.Utf8.parse(key);
   
    
    return CryptoJS.DES.encrypt(data, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.ZeroPadding
    }).toString();

}

python 后端解密

import base64
import hashlib
from Crypto.Cipher import AES, DES
class DeDesCrypt:
    """
    DES-128-CBC解密
    """

    def __init__(self, data, key, pad):
        """
        :param data: 加密后的字符串,在解密是需要先进行base64解密后才行
        :param key: 随机的8位字符
        :param pad: 填充方式
        """
        self.key = key
        self.data = base64.b64decode(data.encode())
        self.pad = pad.lower()
        self.iv = base64.b64encode(key.encode())[0:8]

    @property
    def decrypt_des(self):
        """DES-128-CBC解密"""
        my_des = DES.new(self.key, AES.MODE_CBC, self.iv)

        decrypt_data = my_des.decrypt(self.data)
        return self.get_str(decrypt_data)

    def get_str(self, bd):
        """解密后的数据去除加密前添加的数据"""
        if self.pad == "zero":  # 去掉数据在转化前不足8位长度时添加的ASCII码为0编号的二进制字符
            return ''.join([chr(i) for i in bd if i != 0])
        elif self.pad == "pkcs7":  # 去掉pkcs7模式中添加后面的字符
            return ''.join([chr(i) for i in i > 32])
        else:
            return "不存在此种数据填充方式"

转载原文链接:https://blog.csdn.net/hl120841/article/details/105278277

标签:AES,加密,python,self,解密,JS,key,iv,data
From: https://www.cnblogs.com/liang715200/p/17187081.html

相关文章

  • Python基础【16】如何遍历的同时删除指定的元素?
     ***核心:浅拷贝copy()通过操作副本而去锁定元数去剔除主本的元数,如果遍历删除对象一直是主本的话,遍历删除的同时会出现缺失遍历问题(删除是立马进行的,收集器里面的元素被删......
  • python 调用crypto 实现RSA 加解密
    importbase64fromCrypto.PublicKeyimportRSAfromCrypto.CipherimportPKCS1_v1_5​​​defcipher(msg):"""公钥加密:parammsg:要加密内容......
  • python生成whl
    whl是我们安装python三方库时离线下载的一个文件,用pipinstallxxx.whl即可安装可是有些三方库download时只有tar包文件,没有whl文件比如:pymsgbox  如何生成我们想......
  • python-unittest(部分笔记)
    自带的单元测试框架:创建一个类,必须继承单元测试用例的类——(unittest.TestCase)单元测试的两部分: ①代码级别的功能验证          ②逻辑覆盖单元测试框架......
  • Python爬虫系列之Session和cookie的使用
    对于经常做数据采集的技术员来说,常常遇到采集的页面限制我们的访问,尤其在频繁刷新或者访问一个页面时会引起网站的一些列反爬措施。今天我们就来谈谈Session和cookie的......
  • python_selenium(部分笔记)
    什么是自动化?自动化就是以人力驱动的测试行为转化为机械执行的一种过程目的:节省人力,时间或者硬件资源,提高测试效率哪些场景下适合做自动化?1,任务测试明确,不会频繁变动2,每日......
  • python—基础知识(部分笔记)
    命名注释快捷键变量名复制运算格式化字符   ①:%s格式化字符串   ②:%d格式化整数   ③:%f格式化浮点数字   ④:format()转义字符:\n  \t算术运算符:%取余......
  • python-模块与包
    一、模块模块的本质:具有一定功能(代码)的py文件,或者是文件夹,就是你之前写的代码有功能的都可以叫模块1、python模块的历史python刚开始的时候,所有搞其他编程语言的的程序......
  • Python 异步: 异步迭代器(15)
    动动发财的小手,点个赞吧!迭代是Python中的基本操作。我们可以迭代列表、字符串和所有其他结构。Asyncio允许我们开发异步迭代器。我们可以通过定义一个实现aiter()和......
  • python 学习笔记
     train_test_split函数在机器学习中,我们通常将原始数据按照比例分割为“测试集”和“训练集”,从sklearn.model_selection中调用train_test_split函数 简单用法如......