本帖最后由 clown9s 于 2023-3-26 18:36 编辑
封装前:[Python] 纯文本查看 复制代码 """
Remarks:crypto库的AES加密
"""
import base64 # 调用base64 将二进制转换成64个字符 编码专用
from Crypto.Cipher import AES # 调用AES,AES一种对称加密算法
from Crypto.Util.Padding import pad # 调用pad 当明文或密文位数不足时用于填充空余的位置
if __name__ == '__main__':
p_i_w = b'0123456789012345' # 明文 b 表示bytes(字节)类型
s_k = b'aaaabbbbccccdddd' # 密钥
# key = s_k.encode('utf-8') # 给密钥设定编码,但需要在有类、函数内使用 如有类或函数这是第一步
# s_k = pad(s_k, 16, 'pkcs7')
# pad有三个参数第一个是需填充的数据,第二个是数据最低位数,第三个是非必要参数填充类型
mode = AES.MODE_ECB # 选择AES加密模式 第二步
cryption = AES.new(s_k, mode) # 初始化加密器 第三步
# msg = base64.b64encode(cryption.encrypt(pad(p_i_w, 16)).decode('utf-8')
# 一般来说加密步骤按上面写会比较好,如果加个填充类型就更好了
msg = base64.b64encode(cryption.encrypt(p_i_w)).decode('utf-8') # 开始加密 第四步
# 打印结果
print('明文:%d', p_i_w)
print('密钥:%d', s_k)
print('密文:%d', msg)
封装后:
[Python] 纯文本查看 复制代码 import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
def cryption(data, s_key):
c_data = data.encode('utf-8') # 因为用户输入的是字符串最好转译一下
c_key = s_key.encode('utf-8') # 不是字节类型程序会运行错误
c_mode = AES.MODE_ECB
c_cryption = AES.new(pad(c_key, 16, 'pkcs7'), c_mode)
c_msg = base64.b64encode(c_cryption.encrypt(pad(c_data, 16, 'pkcs7'))).decode('utf-8')
return c_msg
if __name__ == '__main__':
a = input('请输入需加密的文本:')
b = input('请输入密钥:')
c = cryption(a, b)
print('加密后的文本:', c)
修改了一下AES加密模式,其他加密模式需要添加固定的iv否则解密时无法回溯原文本,只有ECB模式不需要添加iv值
如使用crypto库则需要下载pycryptodome(pycrypto已经停止维护了所以建议用pycryptodome)然后在文件存储位置找到crypto文件将其改为Crypto(不改名好像无法调用,反正我是这样的),也可以下载pycryptodomx(pycryptodome的进阶版)
如果用的是anaconda可以参考下面的图片:
文件位置
再次优化方便后续解密:
[Python] 纯文本查看 复制代码 def cryption(data, s_key):
c_data = data.encode('utf-8') # 因为用户输入的是字符串最好转译一下
c_key = s_key.encode('utf-8') # 不是字节类型程序会运行错误
p_k = pad(c_key, 16, 'pkcs7')
p_d = pad(c_data, 16, 'pkcs7')
c_mode = AES.MODE_ECB
c_cryption = AES.new(p_k, c_mode)
c_msg = base64.b64encode(c_cryption.encrypt(p_d)).decode('utf-8')
return c_msg, p_k # 这里多返回了一个p_k(填充后的密钥),正常是只有一个返回值这个值可以删除
解密篇:python学习——AES解密 |