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. 摘要

  1. ECB模式比较简单,不需要偏移量,本文都是以CBC模式为例。
  2. 用JS实现AES算法(基于nodejs的crypto-js库,或者通过导入aes.js,CBC模式,Base64编码)
  3. 用python实现AES算法(基于cryptodemo模块,CBC模式,16进制ASCII编码和Base64编码两种处理加密结果)
  4. 加密明文均兼容中文,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算法,结果一致,且能兼容中文的。

507bacd898e74eb41ccce49c455eebb7.png

AES_JS.png

354c6d3e027f988aa5c026a3874b7a1d.png

AES_python.png

作者:小眯嘻链接:https://www.jianshu.com/p/865f3e570780来源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305187.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Zune 3.0与XNA GS 3.0 Beta

2008年9月16日,微软发布了新的Zune设备,新增了16G和120G的版本,颜色也出现了新颜色,蓝色的比较好看。 与此同时,Zune Software也升级到3.0,有Zune的朋友可以从www.zune.net上下载。Zune 3.0不仅为你的Zune设…

当你老了,一生最后悔什么?大数据告诉你!

‍ 当你老了,一生最后悔什么?

java获取jtable的路径,Java如何在JTable组件中获取选定的单元格?

以下示例显示如何获取选定的行或选定的列,或如何选择JTable组件中的多个单元格。要侦听选择事件,我们可以JTable通过调用JTable.getSelectionModel().addListSelectionListener()方法将选择侦听器添加到组件。该方法接受实现ListSelectionListener接口的…

@scheduled注解配置时间_SpringBoot2.0实战(32)配置定时任务

定时任务的几种实现方式:Timer:Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。Quartz:使用Quartz&…

小心 Enum Parse 中的坑

小心 Enum Parse 中的坑Intro最近使用枚举的时候,踩了一个小坑,分享一下,主要是枚举从 int 值转成枚举时可能会遇到Sample来看下面的示例:首先定义一个枚举:public enum Color : byte {Red 0,Green 1,Blue 2, }来看…

python判断列表是否为空_Jinja2: 判断返回的列表是否为空

我们在使用 Python 或者 Ansible 来进行自动化任务的时候常常会进行一些数据的组合和提取来生成文件。但是我们需要为不同的情况来做分析和进行判断。如果我们需要对返回的 list 来进行提取的时候我们常常只是运行一个 for loop 就解决了问题。如果输出如下所示:{&q…

在php中使用kind,KindEditor 4.x在PHP中的应用实例!

1.解压放入php项目静态资源文件夹,如下图:Paste_Image.png2.如果只是php使用,可以删除其它类型语言的文件夹,文件结构如下图:Paste_Image.png3.打开php文件夹,更改upload_json.php里文件上传目录文件夹至Up…

你的朋友国庆假期都去了哪里玩?微信大数据告诉你!最远的朋友圈签到竟然来自……

国庆中秋八天假 你是出门四处浪浪浪了 还是躺在家里看朋友圈里的世界名景 10月8日,微信发布《国庆假期微信大数据报告》 从出境人数、热门地区、境外消费等角度 全方位展示国庆期间微信用户的出游情况 哪些城市的人最爱出境游? 哪个国家是最热门的出境目…

mysql安装版和解压版哪个好_红米k30pro变焦版和荣耀30pro哪个好-哪个更值得入手...

红米k30pro变焦版和荣耀30pro,两款手机都有着很强的性能配置,也在同等的价位上,今天我们就来对比一下,看看红米k30pro变焦版和荣耀30pro哪个性价比更高,有哪些配置区别!一、主要参数对比荣耀30 Pro红米K30 …

记一次CPU持续100%及分析方法

背景 某天晚上八点多,突然收到一个 CPU 爆表的告警。过了一会,几个业务线就开始反馈系统变慢了。后面紧急处理了这台机器后,让业务先恢复正常。后续看了一下监控,拔凉拔凉的。这个服务是比较重要的一个老业务,.NET Fra…

php中请写出定义变量的两种方法,php定义变量几种

1、定义常量define("CONSTANT", "Hello world.");常量只能包含标量数据(boolean,integer,float 和 string),调用常量时,只需要简单的用名称取得常量的值,而不能加“$”符号。注: 常量和…

八款Js框架介绍及比较~转载

Js框架介绍 目前来看,JS框架以及一些开发包和库类有如下几个,Dojo 、Scriptaculous 、Prototype 、yui-ext 、Jquery 、Mochikit、mootools 、moo.fxDojo (JS library and UI component ):Dojo是目前最为强大的j s框架…

python等值面图平滑_离散点插值方法、等值线的绘制及平滑技巧

离散点插值方法、等值线的绘制及平滑技巧2008-06-10 22:45由于等值线图看起来非常直观、形象,因此在天气预报、气候预测分析等方面用得非常多,已成为预报员不可缺少的工具之一。如各等压面层的位势高度图、高空环流、温度及降水分布图等等。目前也有一些非常好的微机用绘图软件…

c语言三目运算符_C语言中的三目运算符是啥?有何用处?

一般来说,C语言中的三目运算符为a?b:c即有三个参与运算的量。由条件运算符组成条件表达式的一般形式为:表达式1? 表达式2:表达式3求值规则为:如果表达式1的值为真,则以表达式2 的值作为条件表达式的值,否…

Dotnet的局部函数和委托的对比

上一篇说了一下委托,这篇来说说局部函数和委托的对比。把委托和局部函数放成前后篇,是因为这两个内容很像,用起来容易混。需要了解委托相关内容,可以看这一篇 【传送门】使用委托表达式(Lambda)假设一个场景:我们有一个…

JAVA设置新视口,java – 在更大的图像上移动视口; JLablel JScrollPane

这是一个非常基本的例子.它使用一个图像文件并将其放置在一个滚动窗格内(在一个圆形的方式).从那里,它只是使用Swing Timer来随机生成点(在图像的边界内).每次生成一个新点时,我只需使用scrollToRectVisible,传递它想要渲染的点的位置和大小.这将确保新点(和点)在滚动窗格中可见…

经纬度 c代码中定义_如何将TXT文本格式的批量经纬度值导入到奥维成为标签

文本编辑:示例1:最基本的,只批量导入WGS-84经纬度值成为标签,不需要导入标签名称。 文本编辑格式:经度值空格纬度值换行,如下图:示例2:除WGS-84经纬度外,还要导入标签名称…

C# aspx页面动态加载ascx用户控件 及 利用反射调用其内方法

//控件代码 public partial class WebUserControl : System.Web.UI.UserControl { public void TestMethod(string strID) { this.TextBox1.Text " WebUserControl:" strID; //其他相关操作 } } //控件代码 public partial class WebU…

中国式创新技术“步态识别”终于来临,你大胆地走两步,我就知道你是谁

放完假的数据君,回到办公室,苦恼该码一篇什么文章,来给各位送上“节后的祝福”。 这么想着,数据君便开始浏览最新的科技报道: 什么鬼!这难道是什么新兴的黑科技吗?! 数据君赶紧查了…