python3 AES 加解密

admin5年前Python学习66
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#coding:utf-8
import base64
from Crypto.Cipher import AES     #注:python3 安装 Crypto 是 pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple pycryptodome<br><br>
#解密
def aes_decode(data, key):
    try:
        aes = AES.new(str.encode(key), AES.MODE_ECB)  # 初始化加密器
        decrypted_text = aes.decrypt(base64.decodebytes(bytes(data, encoding='utf8'))).decode("utf8")  # 解密
        decrypted_text = decrypted_text[:-ord(decrypted_text[-1])]  # 去除多余补位
    except Exception as e:
        pass
    return decrypted_text
 
#加密
def aes_encode(data, key):
    while len(data) % 16 != 0:     # 补足字符串长度为16的倍数
        data += (16 - len(data) % 16* chr(16 - len(data) % 16)
    data = str.encode(data)
    aes = AES.new(str.encode(key), AES.MODE_ECB)  # 初始化加密器
    return str(base64.encodebytes(aes.encrypt(data)), encoding='utf8').replace('\n', '')  # 加密
 
if __name__ == '__main__':
    key = '12345678g01234ab'  # 密钥长度必须为16、24或32位,分别对应AES-128、AES-192和AES-256
    data = "E83A56F6BCF88E5BD3600C398E39EAAFA91DBA24807B73F7B76FF1E180CEA14DAED6A43F9304901044C50503198C2D3A57661"    # 待加密文本
     
    mi = aes_encode(data,key)
    print("加密值:",mi)
    print("解密值:",aes_decode(mi,key))

  案例2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#coding:utf-8
import base64
from Crypto.Cipher import AES       #注:python3 安装 Crypto 是 pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple pycryptodome<br><br>
def pkcs7padding(text):
    """
    明文使用PKCS7填充
    最终调用AES加密方法时,传入的是一个byte数组,要求是16的整数倍,因此需要对明文进行处理
    :param text: 待加密内容(明文)
    :return:
    """
    bs = AES.block_size  # 16
    length = len(text)
    bytes_length = len(bytes(text, encoding='utf-8'))
    # tips:utf-8编码时,英文占1个byte,而中文占3个byte
    padding_size = length if(bytes_length == length) else bytes_length
    padding = bs - padding_size % bs
    # tips:chr(padding)看与其它语言的约定,有的会使用'\0'
    padding_text = chr(padding) * padding
    return text + padding_text
 
 
def pkcs7unpadding(text):
    """
    处理使用PKCS7填充过的数据
    :param text: 解密后的字符串
    :return:
    """
    try:
        length = len(text)
        unpadding = ord(text[length-1])
        return text[0:length-unpadding]
    except Exception as e:
        pass
 
 
def aes_encode(key, content):
    """
    AES加密
    key,iv使用同一个
    模式cbc
    填充pkcs7
    :param key: 密钥
    :param content: 加密内容
    :return:
    """
    key_bytes = bytes(key, encoding='utf-8')
    iv = key_bytes
    cipher = AES.new(key_bytes, AES.MODE_CBC, iv)
    # 处理明文
    content_padding = pkcs7padding(content)
    # 加密
    aes_encode_bytes = cipher.encrypt(bytes(content_padding, encoding='utf-8'))
    # 重新编码
    result = str(base64.b64encode(aes_encode_bytes), encoding='utf-8')
    return result
 
 
def aes_decode(key, content):
    """
    AES解密
     key,iv使用同一个
    模式cbc
    去填充pkcs7
    :param key:
    :param content:
    :return:
    """
    try:
        key_bytes = bytes(key, encoding='utf-8')
        iv = key_bytes
        cipher = AES.new(key_bytes, AES.MODE_CBC, iv)
        # base64解码
        aes_encode_bytes = base64.b64decode(content)
        # 解密
        aes_decode_bytes = cipher.decrypt(aes_encode_bytes)
        # 重新编码
        result = str(aes_decode_bytes, encoding='utf-8')
        # 去除填充内容
        result = pkcs7unpadding(result)
    except Exception as e:
        pass
    if result == None:
        return ""
    else:
        return result
 
 
 
 
 
key = '12345678g01234ab'
 
# 对英文加密
data = 'Hello!'
mi = aes_encode(key, data)
print(mi)
# 解密
print(aes_decode(key, mi))
 
 
# 中英文混合加密
data = 'Hello, 韩- 梅 -梅'
aes_encode_mixed = aes_encode(key, data)
print(aes_encode_mixed)
# 解密
print(aes_decode(key, aes_encode_mixed))

  


相关文章

让PIP源使用国内镜像,提升下载速度和安装成功率。

对于Python开发用户来讲,PIP安装软件包是家常便饭。但国外的源下载速度实在太慢,浪费时间。而且经常出现下载后安装出错问题。所以把PIP安装源替换成国内镜像,可以大幅提升下载速度,还可以提高安装成...

Python使用openpyxl读写excel文件

这是一个第三方库,可以处理xlsx格式的Excel文件。pip install openpyxl安装。如果使用Aanconda,应该自带了。1.读取Excel文件默认打开的文件为可读写,若有需要可以指...

创建 Django 步骤

1.创建项目  1django-admin startproject 项目名称2.创建APP   1python manage.py startapp app名称 3.修改settings....

数据存储之json文件处理和csv文件处理

什么是json:JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完...

Tesseract-ocr视觉学习-验证码识别及python import pytesseract使用

Tesseract-ocr视觉学习-验证码识别及python import pytesseract使用

 Tesseract-OCR的简单使用与训练  最近看到某个网站提交数据要提交验证码,用tesseract自带的识别,     识别出来是什么鬼,0-9识别成了什么玩意!   &n...

python导出开发环境

python导出开发环境

1.导出开发环境的依赖包本地开发完后,再把代码给别人之前,需要1pip freeze > pip123.txt   2.其他环境安装依赖包1pip install -r pi...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
Music