AES简介以及配合Base64实现加密解密
一、对称加密
1、什么是对称加密
对称加密就是指加密和解密使用同一个密钥的加密方式。
2、对称加密的工作过程
发送方使用密钥将明文数据进行加密成密文,发送给接收方,接收方收到密文后,使用同一个密钥将密文解密成明文。
3、对称加密的优点
加密计算量小,速度快,适合对大量数据进行加密的场景。
4、对称加密的两大不足
- 密钥传输问题:由于对称加密的加密和解密用的是同一个密钥,所以对称加密的安全性就不仅仅取决于加密算法本身的强度,更取决于密钥是否被安全保管,因此加密者如何将密钥安全传递到解密者手里,就成了对称加密面临的关键问题。
- 密钥管理问题:随着密钥数量增多,密钥管理问题会逐渐显现出来。
二、AES加密算法
AES加密算法是众多对成绩密算法中的一种,它的英文全称是Advanced Encryption Standard,翻译过来就是高级加密标准。
AES加密算法采用分组密码体制,每个分组数据的长度为128位16个字节,密钥长度可以是128位16个字节,192位或256位,一共有五种加密模式,我们通常采用需要初始向量IV的CBC模式,初始向量也是128位16个字节。
1、AES的加密流程
(1)五个关键词
分组密码体制:将明文切成一段一段的来进行加密,然后把一段一段的密文拼接起来形成最终密文的加密方式。AES采用分组密码体制,即AES加密会首先把明文切成一段一段的,而且每段数据的长度要求必须是128位16个字节,如果最后一段不够16个字节,就需要用Padding来把这段数据填充满16个字节,然后分别对每段数据进行加密,最后再把每段加密数据拼接起来形成最终密文、
Padding:Padding就是用来把不满16个字节的分组数据填充为16个字节用的,它有三种模式:PKCS5、PKCS7、NOPADDING。PKCS5是指分组数据缺少几个字节,就在数据的末尾填充几个字节的几。比如缺少5个字节,就在末尾填充5个字节的5。PKCS7是指分组数据缺少几个字节,就在数据的末尾填充几个字节的0,比如缺少7个字节,就在末尾填充7个字节的0。No Padding是指不需要填充,也就是说数据的发送方肯定会保证最后一段数据也正好是16个字节。那如果在PKCS5模式下,最后一段数据的内容刚好就是16个16怎么办?那解密端就不知道这一段数据到底是有效数据还是填充数据,PKCS5模式会自动帮我们在最后一段数据后再添加16个字节的数据,而且填充的数据也是16个16,这样解密端就能知道谁是有效数据谁是填充数据了。PKCS7最后一段数据的内容的内容是16个0,也是同样的道理。解密端需要使用和加密端同样的Padding模式,才能准确的十倍有效数据和填充数据。我们开发通常采用PKCS7模式。初始向量IV:初始向量IV的作用是使加密更加安全可靠,我们使用
AES加密时需要主动提供初始向量,而且只需要提供一个初始向量就够了,后面每段数据的加密向量都是前面一段的密文。初始向量IV的长度规定为128位16个字节,初始向量的来源为随机生成。密钥:
AES要求密钥的长度可以是128位16个字节,192位或256位,位数越高,加密强度自然越大,但是加密的效率自然会低一些,因此要做好衡量,我们开发通常采用128位16个字节的密钥,我们使用AES加密时需要主动提供密钥,而且只需要提供一个密钥就够了,每段数据加密使用的都是这一个密钥,密钥来源为随机生成。五种加密模式:
AES一共有五种加密模式,分别是ECB(电码本模式),CBC(密码分组链接模式),CTR(计算器模式),CFB(密码反馈模式),OFB(输出反馈模式)ECB最基本的加密模式,即仅仅使用明文和密钥来加密数据,相同的明文块会被加密成相同的密文块,这样明文和密文的结构将是完全一样的,就会更容易被破解,相对来说不是那么安全,因此很少使用。

CBCCBC模式比EBC模式对了一个初始向量IV,加密的时候,第一个明文块首先会和IV做异或操作,然后在经过密钥加密,然后第一个密文块又会被作为第二个明文块的加密向量来异或,依次类推下去,相同的明文块经过加密后得到的密文块是不同的,明文接口和密文结构也不同,因此更加安全。

CTR计算器模式不常见,在CTR模式中, 有一个自增的算子,这个算子用密钥加密之后的输出和明文异或的结果得到密文,相当于一次一密。这种加密方式简单快速,安全可靠,而且可以并行加密,但是在计算器不能维持很长的情况下,密钥只能使用一次。
CFB和OFB略
(2)AES加密流程(主要针对CBC模式)
> 1、首先`AES`加密会把明文按128位16个字节进行切分,如果数据的最后一段不够16个字节,会用Padding来填充。
>
> 2、把明文块0与初始向量IV做异或操作,再用密钥加密,得到密文块0,同时也会将密文块0用作明文块1的加密向量。
>
> 3、明文块1与密文块0进行异或操作,再用密钥加密,得到密文块1,以此类推。
>
> 4、最后把密文块拼接起来得到最终的密文。
(3)、AES的加密原理
我们探讨AES的加密原理,起始就是探讨加密器里做了什么,加密器里做了四个重要的操作,分别是:密钥扩展,初始轮,重复轮,最终轮。
密钥扩展:根据初始密钥生成后面10轮密钥的操作。
AES内部一共会执行11轮加密,AES会通过一个简单快速的混合操作,根据初始密钥依次生成后面10轮的密钥,每一轮的密钥都是通过上一轮生成的,所以每一轮的密钥都是不同的。初始轮:初始轮就是将128位的明文数据与128位的初始密钥进行异或操作
重复轮:所谓重复轮,就是指把字节混淆,行移位,列混乱,加轮密钥这四个操作重复好几轮。
重复轮重复的论述取决于密钥的长度,128位16位字节的密钥重复轮推荐重复执行9次,192位密钥重复轮推荐重复执行11次,256位密钥重复轮推荐执行13次。
最终轮:最终轮其实和重复轮的操作差不多,知识在最终轮我们丢弃了列混乱这个操作。
三、Python代码实现(配合Base64)
import base64
import json
from Crypto.Cipher import AES
class Aes_cbc(object):
def __init__(self, key):
self.key = key.encode("utf-8") # 密钥
self.vi = "0102030405060708".encode("utf-8") # 偏移量
self.mode = AES.MODE_CBC # 加密模式
def encryption(self, data): # 加密
pad = lambda s: s + (16 - len(s) % 16) * chr(16 - len(s) % 16) # 对字符串进行补位
data = pad(json.dumps(data)).encode("utf-8")
cipher = AES.new(self.key, self.mode, self.vi)
encryptedbytes = cipher.encrypt(data)
# 使用Base64进行编码,返回byte字符串
encodestrs = base64.b64encode(encryptedbytes)
# 对byte字符串按照utf-8进行解码,并返回
return encodestrs.decode("utf-8")
def decrypt(self, data): # 解密
encodebytes = base64.decodebytes(data.encode("utf-8")) # 将加密的数据转换为bytes数据类型
cipher = AES.new(self.key, self.mode, self.vi)
text_decrypted = cipher.decrypt(encodebytes)
unpad = lambda s: s[0:-s[-1]]
return unpad(text_decrypted).decode("utf-8")
if __name__ == '__main__':
a = Aes_cbc("0CoJUm6Qyw8W8jud")
r_code ={
"code": {
"code": "0000",
"msgId": "Success",
"msg": "成功",
},
"bo": {
"applyId": "REQX10000001423",
"openStatus": "1"
},
"other": {
"syncType": "2"
}
}
print(a.encryption(r_code))
print(json.loads(a.decrypt(a.encryption(r_code))))
AES简介以及配合Base64实现加密解密的更多相关文章
- base64位加密解密
1.base64位加密base64是用于传输8Bit字节代码,由上图的编码表可以知道,编码后的内容只包含这64个字符类型,所以称为base64编码 2.编码过程 : 首先将待编码的内容转换成8位二进制 ...
- Javascript实现base64的加密解密【转】
场景 这几天使用PHP向前端传值的时候,遇到一个问题,要将代码传过去赋值.如果使用urlencode()和urldecode()函数,就会出现js无法解码的情况,因为php和js的相关函数算法不一致. ...
- Javascript实现base64的加密解密
//1.加密解密方法使用: //1.加密 var str = '124中文内容'; var base = new Base64(); var result = base.encode(str); // ...
- php AES cbc模式 pkcs7 128位加密解密(微信小程序)
PHP AES CBC模式PKCS7 128位加密 加密: $key = '1234567812345678'; $iv = '1234567890123456'; $message = '12345 ...
- hash模块 hashlib不可逆加密 和 base64算法加密解密
hashlib模块 用于加密相关的操作,代替md5模块和sha模块,主要提供SHA1,SHA224,SSHA256,SHA384,SHA512,MD5算法 直接看代码案例: ---------md5- ...
- js_md5加密和base64的加密解密
1.最近有些人在爬我们公司的数据,然有了这个md5加密的小需求.为什么叫小需求呢?嗯,之前没做过,会以为很复杂. 其实,是想多了. 2.前端md5加密,其实也并不是安全的,因为代码是可见的.也就是说, ...
- Javascript实现base64的加密解密方法
1 function Base64() { 2 // private property 3 _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijkl ...
- 【支付专区】之对字符串数据进行Base64位加密,解密
加密,解密 String pwd="测试"; byte[] bytes = pwd.getBytes("UTF-8"); //加密 String pwdNew= ...
- ASP Base64位 加密解密
网上找了很多,运行时都会提示某个错误,有点乱.后面找到测试,这个转ASNI码的能实现 sBASE_64_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabc ...
- Base64加密解密原理以及代码实现(VC++)
Base64加密解密原理以及代码实现 转自:http://blog.csdn.net/jacky_dai/article/details/4698461 1. Base64使用A--Z,a--z,0- ...
随机推荐
- docker常见问题修复方法
一.运行容器报错:Error response from daemon: Error running DeviceCreate (createSnapDevice) dm_task_run faile ...
- 04 详解”死亡ReLU“问题
本篇文章尝试通过具体的神经网络例子,来深入探讨"死亡ReLU"的问题. 很多资料都会提到神经元"永久性死亡"这种说法,我认为这会对我们的理解产生一定的误解.事实 ...
- Sa-Token v1.41.0 发布 🚀,来看看有没有令你心动的功能!
Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证.权限认证.单点登录.OAuth2.0.微服务网关鉴权 等一系列权限相关问题. 目前最新版本 v1.41.0 已推送至 Mav ...
- 如何打造你自己的 AI 软件工程师(像 Devin 那样)
扩展 DeepSeek 的强化学习蓝图路线到AI的其他方面 Nikhil Anand 图片由GPT-4o生成 "AI 软件工程师"这个概念,其实已经不再遥远了.已经有一些技术在逐步 ...
- BUUCTF--传统知识+古典密码
1.题目 2.知识点 传统知识,天地干支 古典密码:栅栏密码和凯撒密码 3.解题 由天干地支表解题对应,28,30,23,8,17,10,16,30,"+甲子"代表+60 所以得出 ...
- 【Linux】2.3 Linux目录结构
基本介绍 linux 的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录"/",然后在此目录下再创建其他的目录. 深刻理解 linux 树状文件目录是非常重要的,这里 ...
- 【Python】配置pip使用国内镜像源
配置pip使用国内镜像源 零.问题 使用pip安装插件时总是很慢,咋解决呢? 壹.解决 在桌面上你的文件夹内新建pip目录,一般路径如下:C:\Users\{$你的用户名},比如我的用户名是Minuy ...
- access的多个left outer join连接
虽然你有一万个理由,但是选择ACCESS数据库就是一个不能再蠢的决定. 从AC990账务系统中采集凭证记录,需要做多个左连接.在sql server管理器中执行蛮好,没有问题.可是在程序中就一堆Err ...
- 线性判别分析(LDA):降维与分类的完美结合
在机器学习领域,线性判别分析(Linear Discriminant Analysis,简称LDA)是一种经典的算法,它在降维和分类任务中都表现出色. LDA通过寻找特征空间中能够最大化类间方差和最小 ...
- cpp简单总结
1.简述智能指针的特点,简述new和malloc的区别. shared_ptr,显现共享式特点,多个同类型的shared指针可以共享一个对象,当持有者的计数归0,shared_ptr指向的指针就会被释 ...