AES对称加密实战——前端js加密后端python解密

这篇具有很好参考价值的文章主要介绍了AES对称加密实战——前端js加密后端python解密。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

高级加密标准(AES, Advanced Encryption Standard),是一种最常见的对称加密算法 。其加密流程如下图所示,发送方通过密钥对明文加密后进行网络传输,接收方用同样的密钥将密文解密。在前后端通讯场景中,可利用AES算法对用户密码进行加密后传输,防止被抓包而造成密码泄露。

前端aes加密,信息安全,后端,前端,网络安全,javascript,python

为了完成加解密操作,双方需要事先约定好: 秘钥长度,密钥,IV值,加密模式,填充方式共计5项内容。下面以128位密钥长度、CBC加密模式、零填充为例进行实战介绍,更多AES加密算法的细节读者可自行查阅。

前端 JS加解密

前端要实现AES加密,需要安装CryptoJS。 CryptoJS是一个JavaScript的加解密的工具包。它支持多种算法:MD5、SHA1、SHA2、SHA3、RIPEMD-160 的哈希散列,以及进行 AES、DES、Rabbit、RC4、Triple DES 加解密。

npm install --save crypto-js

新建secret.js,将相关操作封装成函数,代码如下:

// 引用AES源码js
const CryptoJS = require('crypto-js');  

// 128位的密钥与IV,与后端约定好
let crypt_key = 'OS7kWn9kGLmr7wxD';
let crypt_iv = 'AgBJQGRaHehjSgjT';
 
// 加密
export function encrypt(data) {
    // 将key解析为字节
    let aes_key = CryptoJS.enc.Utf8.parse(crypt_key);
    // 将iv解析为字节
    let new_iv = CryptoJS.enc.Utf8.parse(crypt_iv);
    // AES加密 CBC模式 ZeroPadding
    let encrypted = CryptoJS.AES.encrypt(data, aes_key, { 
        iv: new_iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.ZeroPadding
    });
    // 返回字符串
    return encrypted.toString();
}
 
//解密
export function decrypt(data) {
    let aes_key = CryptoJS.enc.Utf8.parse(crypt_key);
    let aes_iv = CryptoJS.enc.Utf8.parse(crypt_iv);
     // 将数据编码成Base64格式
    let baseResult=CryptoJS.enc.Base64.parse(data);  
    let ciphertext=CryptoJS.enc.Base64.stringify(baseResult);
    // AES解密 CBC模式 ZeroPadding
    let decryptResult = CryptoJS.AES.decrypt(ciphertext, aes_key, {    
        iv: aes_iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.ZeroPadding
    });
    // 返回字符串
    let resData = decryptResult.toString(CryptoJS.enc.Utf8).toString();
    return resData;
}

测试前端加解密:

import {encrypt, decrypt} from '@/utils/secret' 

let ps = '123456'
let encodePs = encrypt(ps)
let decodePs = decrypt(encodePs)
console.log('encodePs', encodePs)
// 输出:AA2uUXaD4p/s6HcPbX3CGw==
console.log('decodePs', decodePs)
// 输出:123456

后端Python加解密

后端Python要实现AES加密,需要安装 pycryptodome 。

pip install pycryptodome

新建secret.py,将相关操作封装成函数,代码如下:文章来源地址https://www.toymoban.com/news/detail-760870.html

import base64
import random

from Crypto.Cipher import AES

# 随机生成,用于加解密,与前端约定好
aes_key = 'OS7kWn9kGLmr7wxD'
aes_iv = 'AgBJQGRaHehjSgjT'

# 生成指定长度的16进制字符串
def generateRandomNum(n):
    s = ''
    valid_s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
    for i in range(n):
        s += random.choice(valid_s)
    return s

# AES-128-CBC 零填充 加解密
class AESCryptor:
    def __init__(self, key, iv):
        self.key = key.encode('utf-8')
        self.iv = iv.encode('utf-8')

    def encrypt_string(self, data):
        # 编码成字节
        data = data.encode('utf-8')
        # 填充为16的倍数 采用零填充
        while len(data) % 16 != 0:
            data += b'\x00'
        # 加密 采用CBC模式
        my_aes = AES.new(self.key, AES.MODE_CBC, self.iv)
        cipher_data = my_aes.encrypt(data)
        # 返回base64密文
        return base64.b64encode(cipher_data).decode('utf-8')

    def decrypt_string(self, data):
        # 编码为字节
        real_data = base64.b64decode(data)
        # 解密
        my_aes = AES.new(self.key, AES.MODE_CBC, self.iv)
        decrypt_data = my_aes.decrypt(real_data)
        # 解密后的数据去除加密前添加的pad,即0
        pos = len(decrypt_data)-1
        while decrypt_data[pos] == 0:
            pos -= 1
        decrypt_data = decrypt_data[:pos+1].decode('utf-8')
        return decrypt_data


if __name__ == '__main__':
    # 随机生成16*8 = 128位的key 和 iv,手动进行前后端同步
    # print('aes_key', generateRandomNum(16))
    # print('aes_iv', generateRandomNum(16))
    
    # 测试后端加解密
    aes = AESCryptor(aes_key, aes_iv)
    # 前端传回的加密后的数据
    encode_data = 'AA2uUXaD4p/s6HcPbX3CGw=='
    msg = aes.decrypt_string(encode_data)
    print(msg)
    # 输出:123456
    print(aes.encrypt_string(msg))
    # 输出:AA2uUXaD4p/s6HcPbX3CGw== 与前端加密后的数据相同

参考文献

  1. 利用POST进行用户登录的安全问题剖析
  2. 前端AES加密Python后端解密数据
  3. python实现AES加密解密

到了这里,关于AES对称加密实战——前端js加密后端python解密的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# 实现对称加密算法(AES)与非对称加密算法(RSA),包含前端加密对应算法实现

    一种既简单速度又快的加密方式,加密与解密使用的都是同一个密钥,别名又叫做:单密钥加密;对称加密有很多公开算法,并且因为它效率很高,所以适用于加密大量数据的场合;但其密钥的传输过程是不安全的,并且容易被破解,密钥管理起来也相对麻烦。 需要两个密钥

    2024年02月09日
    浏览(48)
  • Python学习笔记——AES 加密/解密

    AES,高级加密标准。目前比较流行的对称加密算法。是一种对称加密算法,即加密和解密都用相同的密钥。 AES只是个基本算法,实现AES有几种模式,主要有ECB、CBC、CFB等几种模式。CBC模式中还有一个偏移量参数IV。 AES加密有AES-128、AES-192和AES-256三种,分别对应三种密钥长

    2023年04月15日
    浏览(33)
  • 【Python】AES 128加密和解密

    AES加密标准又称为高级加密标准Rijndael加密法,是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准。AES的基本要求是,采用对称分组密码体制,密钥长度可以为128、192或256位,分组长度128位,算法应易在各种硬件和软件上实现。1998年NIST开始AES第一轮分析、测试和征

    2024年02月13日
    浏览(39)
  • AES加密解密python实现

            关于现代密码学算法,可以查看以下博客全面了解 CISSP考试要求里的“应用密码学”内容辅助记忆趣味串讲_晓翔仔的博客-CSDN博客         AES的细节知识,可以查阅 AES加密算法的详细介绍与实现_TimeShatter的博客-CSDN博客          AES 加密最常用的模式就是

    2024年02月05日
    浏览(63)
  • 前端js使用AES加密

    我是在uniapp项目里使用,AES加密也分几种模式,我这里有CBC和ECB模式,ECB模式安全性差些但快 加密文件下载 下载好和封装引用

    2024年02月16日
    浏览(30)
  • 前端使用 crypto-js 库 aes加解密

    CryptoJS是一个JavaScript加密算法库,用于在客户端浏览器中执行加密和解密操作。它提供了一系列常见的加密算法,如AES、DES、Triple DES、Rabbit、RC4、MD5、SHA-1等等。 AES 工作原理 AES(高级加密标准)是一种对称加密算法,即加密和解密使用相同的密钥。它可以加密长度为128、

    2024年02月04日
    浏览(32)
  • Python对AES进行加密和解密的多种方法

    前言 本文是该专栏的第24篇,后面会持续分享python的各种干货知识,值得关注。 做过爬虫项目的同学,对AES加解密都有遇到过。 在密码学中,加密算法也分为双向加密和单向加密。单向加密包括MD5、SHA等摘要算法,它们是不可逆的。而双向加密包括 对称加密 和 非对称加密

    2023年04月14日
    浏览(26)
  • 使用非对称加密(RSA) 实现前端加密后端解密

    数据加密方式有: 单向加密、对称加密、非对称加密、加密盐、散列函数、数字签名。 1、单向加密 单向加密通过对数据进行摘要计算生成密文,密文不可逆推还原。只能加密,不能解密,常用于提取数据的指纹信息以此来验证数据的完整性。但是会引发雪崩效应(雪崩效应

    2024年02月08日
    浏览(45)
  • AES(对称加密)和RSA(非对称加密)使用详情

          待加密的明文以16字节分组进行加密,如果数据字节长度不是16的倍数,最后的一组则需要在有效数据后面进行填充,使得数据长度变为16字节,AES填充方式分为NoPadding、PKCS5(PKCS7)、ISO10126、Zeros。 NoPadding :不填充,那就只能加密长度为16倍数的数据,一般不使用; Zero

    2024年02月08日
    浏览(82)
  • AES 对称加密算法

    高级加密标准(英语:Advanced Encryption Standard,缩写:AES),是一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。 那么为什么原来的DES会被取代呢,,原因就在于其使用56位密钥,比较容易被破解。而AES可以使用128、192、和256位密钥,并且

    2023年04月17日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包