aes加密算法python实现_python实现aes加密解密

本文介绍了Python中使用pycryptodome模块实现AES加密解密的方法,详细讲解了加密和解密的过程,包括如何处理非16位倍数的输入数据以及解密时的补位操作。通过创建PrpCrypt类,实现了加密和解密的函数,示例代码展示了加密和解密的实际应用。
摘要由CSDN通过智能技术生成

引子:

在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实现的一种方式

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值