转载https://www.jianshu.com/p/5d27888e7c93#!/xh

#!/usr/bin/env python

# -*- coding=utf-8 -*-

"""

AES加密解密工具类

@author jzx

@date 2018/10/24

此工具类加密解密结果与 http://tool.chacuo.net/cryptaes 结果一致

数据块128位

key 为16位

iv 为16位,且与key相等

字符集utf-8

输出为base64

AES加密模式 为cbc

填充 pkcs7padding

"""

import base64

from Crypto.Cipher import AES

import random

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:

"""

length = len(text)

unpadding = ord(text[length-1])

return text[0:length-unpadding]

def encrypt(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)

# 加密

encrypt_bytes = cipher.encrypt(bytes(content_padding, encoding='utf-8'))

# 重新编码

result = str(base64.b64encode(encrypt_bytes), encoding='utf-8')

return result

def decrypt(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)

# base64解码

encrypt_bytes = base64.b64decode(content)

# 解密

decrypt_bytes = cipher.decrypt(encrypt_bytes)

# 重新编码

result = str(decrypt_bytes, encoding='utf-8')

# 去除填充内容

result = pkcs7unpadding(result)

return result

def get_key(n):

"""

获取密钥 n 密钥长度

:return:

"""

c_length = int(n)

source = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'

length = len(source) - 1

result = ''

for i in range(c_length):

result += source[random.randint(0, length)]

return result

# Test

# 非16字节的情况

aes_key = get_key(16)

print('aes_key:' + aes_key)

# 对英文加密

source_en = 'Hello!'

encrypt_en = encrypt(aes_key, source_en)

print(encrypt_en)

# 解密

decrypt_en = decrypt(aes_key, encrypt_en)

print(decrypt_en)

print(source_en == decrypt_en)

# 中英文混合加密

source_mixed = 'Hello, 韩- 梅 -梅'

encrypt_mixed = encrypt(aes_key, source_mixed)

print(encrypt_mixed)

decrypt_mixed = decrypt(aes_key, encrypt_mixed)

print(decrypt_mixed)

print(decrypt_mixed == source_mixed)

# 刚好16字节的情况

en_16 = 'abcdefgj10124567'

encrypt_en = encrypt(aes_key, en_16)

print(encrypt_en)

# 解密

decrypt_en = decrypt(aes_key, encrypt_en)

print(decrypt_en)

print(en_16 == decrypt_en)

mix_16 = 'abx张三丰12sa'

encrypt_mixed = encrypt(aes_key, mix_16)

print(encrypt_mixed)

decrypt_mixed = decrypt(aes_key, encrypt_mixed)

print(decrypt_mixed)

print(decrypt_mixed == mix_16)

aes加密算法python语言实现_python-AES加密解密相关推荐

  1. aes加密算法python语言实现_python实现AES/DES/RSA/MD5/SM2/SM4/3DES加密算法模板汇总

    都是作者累积的,且看其珍惜,大家可以尽量可以保存一下,如果转载请写好出处https://www.cnblogs.com/pythonywy 一.md5加密 1.简介 这是一种使用非常广泛的加密方式,不 ...

  2. aes加密算法python语言实现_C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]...

    原文:http://outofmemory.cn/code-snippet/35524/AES-with-javascript-java-csharp-python-or-php c#里面的AES加密 ...

  3. python rsa库_python RSA加密解密

    RSA加密(pip install pycryptodome) 总结: Pycrypto提供了比较完善的加密算法.RSA广泛用于加密与解密,还有数字签名通信领域.使用Publick/Private秘钥 ...

  4. aes加密算法python语言实现_如何用Python实现AES CCM的加解密

    1.简介 AES CCM被广泛应用于现代通讯中,在学习过程中需要验证数据的加解密的结果,那么有个方便修改的Python脚本工具就是一个迫切的需求. 2. 实施 我们下面介绍如何实现AES CCM的Py ...

  5. aes算法的C语言实现代码,AES加密算法c语言实现代码

    AES加密算法c语言实现代码 #include "stdio.h" #include "memory.h" #include "time.h" ...

  6. 基于Python语言、RSA非对称加密的IRC聊天室客户端

    源码地址: (55条消息) 基于Python语言.RSA非对称加密的IRC聊天室客户端源码与应用程序-Python文档类资源-CSDN文库 1 研究背景和现状 IRC是Internet Relay C ...

  7. 第10课 511遇见易语言大漠字库图片加密解密

    第10课 511遇见易语言大漠字库图片加密解密 小知识 给图片加密码防止被人盗用 加密工具 大漠综合工具 如果要使用加密后的图片 那么在代码里面一定要在使用前 setpicpwd 小知识:给字库加密码 ...

  8. aes加密算法python实现_Python基于pycrypto实现的AES加密和解密算法示例

    本文实例讲述了Python基于pycrypto实现的AES加密和解密算法.分享给大家供大家参考,具体如下: 一 代码 # -*- coding: UTF-8 -*- import string imp ...

  9. aes加密算法c#语言实现,C#编程实现加密解密文件夹核心代码

    类型:加密解密大小:296KB语言:中文 评分:8.0 标签: 立即下载 用C#语言实现一个文件夹锁的程序,网上类似的"xxx文件夹xxx"软件很多,但是基本上都是C/C++语言实 ...

最新文章

  1. 【git】git入门之把自己的项目上传到github
  2. npm如何删除node_modules文件夹
  3. iOS开发UI中懒加载的使用方法
  4. Apache配置代理服务器的方法(1)
  5. (转)linux基本变量学习:位置变量$0 、$1 shift轮替、本地变量、环境变量、特殊变量...
  6. 为了方便读者检索和阅读以往的内容,已开通“号内搜”功能
  7. 【硬件】存储的RAID技术详解
  8. html:运用表单表格制作简易个人简历
  9. 2021年最新DNF脚本框架
  10. 如何使用Xposed+JustTrustMe来突破SSL Pinning
  11. 蝉道Bug管理工具的环境搭建
  12. HDU 5336 BFS
  13. 《国史通鉴》- 宋朝
  14. ajax中返回sucess里使用this.$message()
  15. 雷军:企业如何渡过寒冬?你需要学会这5招
  16. 2020usnews计算机排名布朗,布朗大学排名在2020年USNEWS美国最佳综合大学排名第14...
  17. GBase 8c 远程数据库连接
  18. python线性回归预测pm2.5_基于随机森林算法的PM2.5预测
  19. 初学C语言:判断输入的数是否能被5整除。
  20. 编程大佬是否能记住代码?

热门文章

  1. MySQL高级知识(十四)——行锁
  2. Axure移动端通用元件库rplib格式包含安卓、苹果各种主流手机、平板线框图元件库、IOS系统图标、人物图标、导航和分页、表格元素、各种小图标等
  3. Windows 10 上强制Visual Studio以管理员身份运行
  4. git---Git中.gitignore配置
  5. notepad++,vim驼峰命名与下划线的互相转换
  6. 关于HTML Button点击自动刷新页面的问题解决
  7. Python【第一篇】python安装、pip基本用法、变量、输入输出、流程控制、循环
  8. Java中怎么控制线程訪问资源的数量
  9. UVA 12169 Disgruntled Judge
  10. Real-time HTML Editor (实时网页编辑器)