Python实现aes加密解密多种方法解析

作者:Yuan_x 时间:2021-05-13 01:36:53 

引子:

在windows中python3使用 pycryptodemo 模块实现Aes加密解密。Aes加密有多种方式,自己可以上网了解下。 AES是每16位一加密,并且保证key和vi都是16位的。废话不多说直接上代码。


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

class PrpCrypt(object):
 def __init__(self,key,iv):
   self.key=key.encode('utf-8')
   self.mode=AES.MODE_CBC
   self.iv=iv.encode('utf-8')

def pad_byte(self, b):
   '''
   1 先计算所传入bytes类型文本与16的余数
   2 在将此余数转成bytes 当然用0补位也可以
   3 已知了 余数 那么就用余数*被转成的余数,就得到了需要补全的bytes
   4 拼接原有文本和补位
   :param b: bytes类型的文本
   :return: 返回补全后的bytes文本
   '''
   bytes_num_to_pad = AES.block_size - (len(b) % AES.block_size)
   # python3 中默认unicode转码
   # 实际上byte_to_pad 就已经 将 数字转成了unicode 对应的字符 即使你的入参正好是16的倍数,那么bytes也是把列表整体的转码也是有值的
   # 后边解密的匿名函数 拿到最后一个数字后,就知道应该截取的长度,在反着切片就行了
   # 这样保证了数据的完整性
   byte_to_pad = bytes([bytes_num_to_pad])
   padding = byte_to_pad * bytes_num_to_pad
   padded = b + padding
   return padded

def encrypt(self,text):
   '''
   1 先生成aes实例
   2 对传入的text转成bytes
   3 对传入的text补全
   4 调用encrypt 加密 得到密文
   5 先将密文转16进制,在将16进制用base64转码,然后在将得到的base64解码
   其实在步骤4 就已经完成了aes加密,我所在的公司加密比较复杂 ,需要的可以直接返回步骤4的值

:param text:
   :return:
   '''
   cryptor = AES.new(self.key,self.mode,self.iv)
   text = text.encode('utf-8')
   text = self.pad_byte(text)
   self.ciphertext = cryptor.encrypt(text)
   cryptbase64 = base64.b64encode(b2a_hex(self.ciphertext)).decode('utf8')
   return cryptbase64

def decrypt(self,text):
   '''
   解密和加密的顺序是相反的
   1 定义匿名函数,去掉补位
   2 base64解码
   3 生成aes实例
   4 16进制转2进制
   5 使用decrypt解码 得到补全的bytes类型明文

:param text:
   :return: 解密且去掉补位的明文
   '''
   unpad = lambda s: s[:-ord(s[len(s) - 1:])]
   base64Str = base64.b64decode(text.encode('utf8'))
   cryptor = AES.new(self.key, self.mode, self.iv)
   aesStr = cryptor.decrypt(a2b_hex(base64Str))
   aesStr = str(unpad(aesStr), encoding='utf8')
   return aesStr
if __name__ == '__main__':
 data='sadfsasdgsdfgdsf123'
 pc=PrpCrypt('daajanbaqa654321','1234567890123456')
 redata = pc.encrypt(data)
 print(redata)
 result=pc.decrypt(redata)
 print(result)

思路:

这里引用一句前辈的话,思路很重要。具体的怎么实现反而在其次。

1 因为Aes是按照16位加密的,key和iv都好说,可以直接设置成定长的16位。

2 因为传入的数据和传回的数据不是定长的,所以加密的时候要先判断是否是16位的倍数,如果不够那么就补全。

3 问题是对端拿到数据后怎么知道从哪里截取。

1 在对传入数据做是否16位判断的时候,你就知道了要补多少位,将这个数字转成bytes类型,python3中默认unicode码。

2 对端拿到数据后,先截取最后一位,在根据unicode转成对应数字,那么对端就知道了从哪开始截取。

3 看下unicode和utf8的关系,utf8是unicode实现的一种方式

来源:https://www.cnblogs.com/yuan-x/p/12361500.html

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

猜你喜欢

  • Python jieba分词添加自定义词和去除不需要长尾词的操作方法

    2023-05-05 11:20:35
  • SQL Server数据库优化经验总结

    2009-03-16 14:22:00
  • [CSS+JS]同一页面可以重复使用的选项卡

    2009-02-12 12:53:00
  • 使用python爬取taptap网站游戏截图的步骤

    2021-09-17 07:44:34
  • driver = webdriver.Chrome()报错问题及解决

    2023-04-09 21:03:16
  • 从语义开始–概念、意义、实践

    2010-06-13 18:06:00
  • numpy矩阵数值太多不能全部显示的解决

    2023-09-09 13:55:41
  • Python基于socket模块实现UDP通信功能示例

    2023-08-25 06:45:27
  • ASP之对象总结

    2008-02-27 13:18:00
  • 详解python函数传参是传值还是传引用

    2023-11-13 13:25:58
  • python plotly画柱状图代码实例

    2023-11-29 13:41:31
  • Python3 sys.argv[ ]用法详解

    2021-08-03 00:16:29
  • 如何用ASP输出HTML文件?

    2010-06-11 20:01:00
  • python try except 捕获所有异常的实例

    2023-03-22 18:49:50
  • 答题辅助python代码实现

    2022-06-30 19:57:35
  • 如何用SQL语句来建表?

    2010-06-13 14:38:00
  • PHP使用星号隐藏用户名,手机和邮箱的实现方法

    2023-11-05 10:41:56
  • Python下使用Scrapy爬取网页内容的实例

    2022-05-29 13:43:24
  • python实现的批量分析xml标签中各个类别个数功能示例

    2021-01-16 00:22:00
  • css网页下拉菜单制作方法(3):样式修饰

    2007-02-03 11:39:00
  • asp之家 网络编程 m.aspxhome.com