python base64编码_JS和Python实现AES算法
1. AES原理
AES算法是典型的对称加密算法,AES原理可以学习这两篇文档:
- 漫画:什么是AES算法:https://www.toutiao.com/i6783550080784794124/
- AES加密算法的详细介绍与实现:https://blog.csdn.net/qq_28205153/article/details/55798628
- 或者可以看之前我整理的:AES算法原理
2. 摘要
- ECB模式比较简单,不需要偏移量,本文都是以CBC模式为例。
- 用JS实现AES算法(基于nodejs的crypto-js库,或者通过导入aes.js,CBC模式,Base64编码)
- 用python实现AES算法(基于cryptodemo模块,CBC模式,16进制ASCII编码和Base64编码两种处理加密结果)
- 加密明文均兼容中文,JS与python实现的AES算法结果一致
3.JS实现AES算法
3.1 基于node环境
npm install crypto-js
// test.js,Base64编码,`node test`执行const CryptoJS = require("crypto-js");var key ="0CoJUm6Qyw8W8jud";var iv = "0102030405060708";function encrypt(text){ return CryptoJS.AES.encrypt(text,CryptoJS.enc.Utf8.parse(key),{ iv:CryptoJS.enc.Utf8.parse(iv), mode:CryptoJS.mode.CBC, padding:CryptoJS.pad.Pkcs7 })}function decrypt(text){ var result = CryptoJS.AES.decrypt(text,CryptoJS.enc.Utf8.parse(key),{ iv:CryptoJS.enc.Utf8.parse(iv), mode:CryptoJS.mode.CBC, padding:CryptoJS.pad.Pkcs7 }) return result.toString(CryptoJS.enc.Utf8)}var text="小眯嘻";var encoded=encrypt(text)console.log(encoded.toString());console.log(decrypt(encoded))
3.2 不需要node环境
导入 aes.js 脚本,也能直接使用
www.jb51.net aes.js
4.Python实现AES算法
pip install pycryptodome
pycryptodome 库是对 pycrypto 库的扩展
4.1 十六进制ASCII处理加密结果
from Crypto.Cipher import AESfrom binascii import b2a_hex, a2b_hex# 如果text不足16位的倍数就用空格补足为16位# 不同于JS,pycryptodome库中加密方法不做任何padding,因此需要区分明文是否为中文的情况def add_to_16(text): pad = 16 - len(text.encode('utf-8')) % 16 text = text + pad * chr(pad) return text.encode('utf-8')# 加密函数def encrypt(text, key, mode, iv): text = add_to_16(text) cryptos = AES.new(key, mode, iv) cipher_text = cryptos.encrypt(text) return b2a_hex(cipher_text).decode('utf-8')def decrypt(text, key, mode, iv): cryptos = AES.new(key, mode, iv) text = a2b_hex(text) plain_text = cryptos.decrypt(text) # return plain_text.decode('utf-8') return bytes.decode(plain_text)if __name__ == '__main__': key = '0CoJUm6Qyw8W8jud'.encode('utf-8') mode = AES.MODE_CBC iv = '0102030405060708'.encode('utf-8') text = "小眯嘻的博客123" e = encrypt(text, key, mode, iv) # 加密 print("加密后:", e) d = decrypt(e, key, mode, iv) # 解密 print("解密后:", d)
encode() 和 decode() 方法用于字符串与 bytes 的互相转换。binascii 模块包含很多用来方法来转换二进制和各种ASCII编码的二进制表示法,其中 b2a_hex() 和 a2b_hex() 方法用于 bytes 与 16进制ASCII 的互相转换。
Python的内置函数 bytes() 可以将字符串str类型转换成bytes类型,必须明确encoding的参数,不可省略。而如果字符串内容都是 ASCII 字符,则可以通过直接在字符串之前添加 'b' 来构建字节串值,就能直接将一个字符串转换成 bytes 对象。同样的,bytes转为字符串,python3中的内置函数ascii()返回一个字符串对象,如果参数中有非ascii字符,会用 u,U,x 来替代。
encrypt() 和 decrypt() 方法返回的结果是bytes类型。因为输出的bytes中的字节不一定能与ascii字符集对应的上,因此先将bytes转换为16进制的ASCII,便于保存输出结果。
4.2 Base64编码加密结果
python中的基本使用
# 编码>>> base64.b64encode(b'/x01') # 想象它是一张图片,编码成 base64 之后,就能进行传输b'L3gwMQ=='# 解码>>> base64.b64decode(b'L3gwMQ==') # 传输成功之后,在把解码回来变成一张图片b'/x01'
前面的AES算法中,如果将加密结果转成Base64位,
import base64from Crypto.Cipher import AESfrom binascii import b2a_hex, a2b_hex# 如果text不足16位的倍数就用空格补足为16位# 不同于JS,pycryptodome库中加密方法不做任何padding,因此需要区分明文是否为中文的情况def add_to_16_cn(text): pad = 16 - len(text.encode('utf-8')) % 16 text = text + pad * chr(pad) return text.encode('utf-8')# 加密函数def encrypt(text, key, mode, iv): text = add_to_16_cn(text) cryptos = AES.new(key, mode, iv) cipher_text = cryptos.encrypt(text) # return b2a_hex(cipher_text).decode('utf-8') return base64.b64encode(cipher_text).decode('utf-8') #base编码def decrypt(text, key, mode, iv): cryptos = AES.new(key, mode, iv) # text = a2b_hex(text) text = base64.b64decode(text) #base64解码 plain_text = cryptos.decrypt(text) return plain_text.decode('utf-8')if __name__ == '__main__': key = '0CoJUm6Qyw8W8jud'.encode('utf-8') mode = AES.MODE_CBC iv = '0102030405060708'.encode('utf-8') text = "小眯嘻的博客123" e = encrypt(text, key, mode, iv) # 加密 print("加密后:", e) d = decrypt(e, key, mode, iv) # 解密 print("解密后:", d)
5.结果验证
验证一下,JS与python实现的AES算法,结果一致,且能兼容中文的。
AES_JS.png
AES_python.png
作者:小眯嘻链接:https://www.jianshu.com/p/865f3e570780来源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
python base64编码_JS和Python实现AES算法相关推荐
- Python base64编码
Python base64编码 1.bytes.decode() decode()方法语法: bytes.decode(encoding="utf-8", errors=" ...
- Python base64编码解码
import base64copyright = '17634231213823859694940628000252303992'def main():#转成bytes stringbytesStri ...
- python创意编码_中学生Python创意编程
本书以Python 3.7为编程工具,共分8个单元,从易到难,从基础应用到综合实战,详细讲解Python创意编程的方法和思维. 本书通过丰富有趣的实例,帮助学生学习编程思维方式,掌握Python编程基 ...
- python base64编码与图片之间的转换
图片 --> base64 #image转base64 import base64 with open("D:\Download\1.jpg","rb") ...
- 关于python字符编码_关于python文件的字符编码
# -*- coding: utf-8 -*-字符编码是啥? 在弄清楚字符编码是啥之前我们要先考虑一个问题.如果计算机最基础的就是0和1,那么他们是如何识别我们输入的英文字母和数字的. 下面是数学知识 ...
- python base64 实现_用Python开发GUI实战教程:图片转换素描画工具
python作为胶水语言,它几乎是无所不能的,但个人一直觉得在GUI开发方面,python可以算作是短板了,为什么?因为性能-python的性能问题,往往出现在其他编程语言对其的鄙夷中.但不管如何py ...
- python如何将网络上的图片url和base64编码的图片保存在本地
1.python base64编码的图片保存到本地 import os import base64 sss ="""/9j/4AAQSkZJRgABAQEASABIAAD ...
- 现代密码学—密码学基本编码实践 16进制向base64编码转换 等长16进制字符串异或 找出密钥并破解密文 python
实验地点:E楼III区503 实验时间:11.17 一.实验室名称:攻防实验室 二.实验项目名称:密码学基本编码实践 三.实验学时:6学时 四.实验原理: Base64是网络上最常见的用于传输8Bit ...
- Python PEP8 编码规范中文版
Python PEP8 编码规范中文版 2018年01月02日 19:21:09 阅读数:22140 标签: python 更多 个人分类: Python 原文链接:http://legacy.pyt ...
最新文章
- 【手写系列】透彻理解Spring事务设计思想之手写实现
- Crawl:利用bs4和requests爬取了国内顶级某房源平台(2020年7月2日上海二手房)将近30*100多条数据并进行房价分析以及预测
- 深度学习代码注解(一)—— mnistdeepauto
- 天天象棋 残局闯关 第2关
- 创建springmvc配置
- 【报名中】数据库大咖们与你聊聊云上实践的那些事儿
- 深入了解Zookeeper核心原理
- 1000道Python题库系列分享23(61个填空题)
- 【刘文彬】【精解】EOS TPS 多维实测
- 编程语言和shell编程的基础内容以及grep、egrep命令及相应的正则表达式和用法...
- 7-24 说反话-加强版 (20 分)
- Google AI 博客:Hum to Search 项目,使用机器学习来识别随口哼唱的旋律
- 【JAVA】-- 黄金矿工小游戏(二)(实现思路+每步代码)
- C语言——今天星期几(详细注释)
- 可用NVI模式替换virtual函数继承方式
- 学习java随堂练习-20220621
- 神经网络学习笔记(五) 径向基函数神经网络
- English马力-Lesson1(MY MYSELF,IRENE)
- Python汉译英小程序
- 秉火429笔记之十三 通信基本概念