Python 的AES加密与解密实现

作者:niuu 时间:2022-07-09 21:49:49 

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。---百度百科

AES加密方式有五种:ECB, CBC, CTR, CFB, OFB

 1.ECB模式(电子密码本模式:Electronic codebook)

ECB是最简单的块密码加密模式,加密前根据加密块大小(如AES为128位)分成若干块,之后将每块使用相同的密钥单独加密,解密同理。

2.CBC模式(密码分组链接:Cipher-block chaining)

CBC模式对于每个待加密的密码块在加密前会先与前一个密码块的密文异或然后再用加密器加密。第一个明文块与一个叫初始化向量的数据块异或。

3.CFB模式(密文反馈:Cipher feedback)

与ECB和CBC模式只能够加密块数据不同,CFB能够将块密文(Block Cipher)转换为流密文(Stream Cipher)。

4.OFB模式(输出反馈:Output feedback)

OFB是先用块加密器生成密钥流(Keystream),然后再将密钥流与明文流异或得到密文流,解密是先用块加密器生成密钥流,再将密钥流与密文流异或得到明文,由于异或操作的对称性所以加密和解密的流程是完全一样的。

从安全性角度推荐CBC加密方法,本文介绍了CBC,ECB两种加密方法的python实现

python 在 Windows下使用AES时要安装的是pycryptodome 模块   pip install pycryptodome

python 在 Linux下使用AES时要安装的是pycrypto模块   pip install pycrypto

CBC加密需要一个十六位的key(密钥)和一个十六位iv(偏移量)

ECB加密不需要iv

AES CBC 加密的python实现


from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex

# 如果text不足16位的倍数就用空格补足为16位
def add_to_16(text):
if len(text.encode('utf-8')) % 16:
 add = 16 - (len(text.encode('utf-8')) % 16)
else:
 add = 0
text = text + ('\0' * add)
return text.encode('utf-8')

# 加密函数
def encrypt(text):
key = '9999999999999999'.encode('utf-8')
mode = AES.MODE_CBC
iv = b'qqqqqqqqqqqqqqqq'
text = add_to_16(text)
cryptos = AES.new(key, mode, iv)
cipher_text = cryptos.encrypt(text)
# 因为AES加密后的字符串不一定是ascii字符集的,输出保存可能存在问题,所以这里转为16进制字符串
return b2a_hex(cipher_text)

# 解密后,去掉补足的空格用strip() 去掉
def decrypt(text):
key = '9999999999999999'.encode('utf-8')
iv = b'qqqqqqqqqqqqqqqq'
mode = AES.MODE_CBC
cryptos = AES.new(key, mode, iv)
plain_text = cryptos.decrypt(a2b_hex(text))
return bytes.decode(plain_text).rstrip('\0')

if __name__ == '__main__':
e = encrypt("hello world") # 加密
d = decrypt(e) # 解密
print("加密:", e)
print("解密:", d)

AES ECB加密的python实现


"""
ECB没有偏移量
"""
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex

def add_to_16(text):
if len(text.encode('utf-8')) % 16:
 add = 16 - (len(text.encode('utf-8')) % 16)
else:
 add = 0
text = text + ('\0' * add)
return text.encode('utf-8')

# 加密函数
def encrypt(text):
key = '9999999999999999'.encode('utf-8')
mode = AES.MODE_ECB
text = add_to_16(text)
cryptos = AES.new(key, mode)

cipher_text = cryptos.encrypt(text)
return b2a_hex(cipher_text)

# 解密后,去掉补足的空格用strip() 去掉
def decrypt(text):
key = '9999999999999999'.encode('utf-8')
mode = AES.MODE_ECB
cryptor = AES.new(key, mode)
plain_text = cryptor.decrypt(a2b_hex(text))
return bytes.decode(plain_text).rstrip('\0')

if __name__ == '__main__':
e = encrypt("hello world") # 加密
d = decrypt(e) # 解密
print("加密:", e)
print("解密:", d)

来源:https://www.cnblogs.com/niuu/p/10107212.html

标签:Python,AES,加密,解密
0
投稿

猜你喜欢

  • 浅谈Python 钉钉报警必备知识系统讲解

    2023-11-13 15:14:38
  • 在python中利用try..except来代替if..else的用法

    2023-09-12 17:50:10
  • Django实现自定义404,500页面教程

    2021-06-20 06:23:07
  • python中的zip模块

    2023-09-13 07:49:56
  • 基于python实现学生管理系统

    2021-11-24 21:07:48
  • 一些文档中没有介绍的SQL Server DBCC命令

    2008-12-09 14:24:00
  • SQL SERVER 与ACCESS、EXCEL的数据转换

    2024-01-18 04:24:40
  • 用 Python 连接 MySQL 的几种方式详解

    2023-07-25 08:08:50
  • 通过T-SQL语句实现数据库备份与还原的代码

    2011-12-01 08:02:15
  • python实点云分割k-means(sklearn)详解

    2023-11-06 20:36:03
  • MySql中特殊运算符的使用方法总结

    2024-01-19 23:27:09
  • Python groupby函数图文详解

    2021-10-01 06:17:09
  • 详解vue数组遍历方法forEach和map的原理解析和实际应用

    2024-05-05 09:06:18
  • 浅谈python字符串方法的简单使用

    2021-07-14 11:16:25
  • OpenCV imread读取图片失败的问题及解决

    2021-10-20 06:44:00
  • SQL语句实例说明 方便学习mysql的朋友

    2012-11-30 20:02:43
  • python实现的简单FTP上传下载文件实例

    2022-12-29 13:17:42
  • web版Photoshop来了

    2008-04-21 13:39:00
  • python获取交互式ssh shell的方法

    2021-11-25 13:15:21
  • 利用python进行接口测试及类型介绍

    2021-02-11 21:27:01
  • asp之家 网络编程 m.aspxhome.com