- AES 加密
- 一、前言
- 1、 简介
- 2、 加密模式
- 3、 环境配置
- 二、算法实现
- 一、前言
AES,高级加密标准(Advanced Encryption Standard)。是用来替代 DES,目前比较流行的对称加密算法。对称加密算法就是加密和解密用相同的密钥,具体的加密流程如下图
明文 P:
等待加密的数据。
密钥 K:
用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的。密钥为接收方与发送方协商产生,但不可以直接在网络上传输,否则会导致密钥泄漏,通常是通过非对称加密算法加密密钥,然后再通过网络传输给对方,或者直接面对面商量密钥。密钥是绝对不可以泄漏的,否则会被攻击者还原密文,窃取机密数据。
AES 加密函数:
设 AES 加密函数为 E,则 C = E(K, P),其中 P 为明文,K 为密钥,C 为密文。也就是说,把明文 P 和密钥 K 作为加密函数的参数输入,则加密函数 E 会输出密文 C。
密文 C:
经过 AES 加密后的数据。
AES 解密函数:
设 AES 解密函数为 D,则 P = D(K, C),其中 C 为密文,K 为密钥,P 为明文。也就是说,把密文 C 和密钥 K 作为解密函数的参数输入,则解密函数会输出明文 P。
AES 只是个基本算法,实现 AES 有几种模式,主要有 ECB、CBC、CFB 和 OFB 这几种(其实还有个 CTR)
-
电码本模式(ECB)
这种模式是将整个明文分为若干段相同的小段,然后对每一小段进行加密
-
密码分组链接模式(CBC)
这种模式是先将明文分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后再与密钥进行加密
-
计算器模式(CTR)
完全的流模式。将瞬时值与计数器连接起来,然后对此进行加密产生密钥流的一个密钥块,再进行XOR操作
-
密码反馈模式(CFB)
把分组密码当做流密码使用,即密码反馈模式可将DES分组密码置换成流密码。流密码具有密文和明文长度一致、运行实时的性质,这样数据可以在比分组小得多的单元里进行加密。如果需要发送的每个字符长为8比特,就应使用8比特密钥来加密每个字符。如果长度超过8比特,则造成浪费。但是要注意,由于CFB模式中分组密码是以流密码方式使用,所以加密和解密操作完全相同,因此无法适用于公钥密码系统,只能适用于对称密钥密码系统
-
输出反馈模式(OFB)
密码算法的输出(指密码key而不是密文)会反馈到密码算法的输入中,OFB模式并不是通过密码算法对明文直接加密,而是通过将明文分组和密码算法的输出进行XOR来产生密文分组
- 安装
pip install pycryptodomex
- 导包
from Crypto.Cipher import DES # 导入模块进行加密
二、算法实现
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: A.L.Kun
# @file : test.py
# @time : 2022/4/25 6:22
import binascii # 进行进制的转换
from Crypto.Cipher import DES # 导入DES模块
from Crypto import Random # 进行随机的偏移量
# 加密函数
def encryption(key, iv, data):
"""
:param key:加密密钥,8位数据
:param iv: 偏移量,Only applicable for ``MODE_CBC``, ``MODE_CFB``, ``MODE_OFB``,
and ``MODE_OPENPGP`` modes,并且长度必须为8
:param data: 要加密的数据
:return: 返回密文
"""
cipher = DES.new(key, DES.MODE_CFB, iv) # 创建加密对象,以及加密规则
data = cipher.encrypt(data.encode()) # 对数据进行编码后进行加密
return binascii.b2a_hex(data) # 得到加密后的16进制数据
# 解密函数
def decryption(key, iv, data):
"""DES解密函数"""
data = binascii.a2b_hex(data) # 把十六进制的密文数据转换成二进制数据
decipher = DES.new(key, DES.MODE_CFB, iv) # 创建相同的解密规则
return decipher.decrypt(data).decode() # 进行解码
keys = b"maqudong" # 密钥
iv = Random.new().read(8) # 随机偏移量
data = "一寸相思千万绪,人间每个安排处"
ret = encryption(keys, iv, data)
r_ret = decryption(keys, iv, ret)
print(r_ret)
from Crypto.Cipher import AES
# 进行AES加密,方法和DES加密类似,还有一些参数长度的变化,请通过源码查看