python aes padding_python AES_CBC_128 PKCS7Padding

该博客介绍了如何在Python中使用cryptography和pycryptodome库实现AES/CBC/PKCS7Padding的加密和解密。通过创建PrpCrypt类,定义了加密和解密方法,处理了不足16位和非16的倍数长度的数据,并提供了字典转JSON字符串的辅助功能。
摘要由CSDN通过智能技术生成

from cryptography.hazmat.primitives importpaddingfrom cryptography.hazmat.primitives.ciphers importalgorithmsfrom Crypto.Cipher importAESfrom binascii importb2a_hex, a2b_heximportjsonimportbase64'''AES/CBC/PKCS7Padding 加密解密

环境需求:

pip3 install pycryptodome'''

classPrpCrypt(object):def __init__(self, key='0000000000000000'):

self.key= '1111111111111111'.encode('utf-8')

self.mode=AES.MODE_CBC

self.iv= b'2222222222222222'

#block_size 128位

#加密函数,如果text不足16位就用空格补足为16位,

#如果大于16但是不是16的倍数,那就补足为16的倍数。

defencrypt(self, text):

cryptor=AES.new(self.key, self.mode, self.iv)

text= text.encode('utf-8')#这里密钥key 长度必须为16(AES-128),24(AES-192),或者32 (AES-256)Bytes 长度

#目前AES-128 足够目前使用

text=self.pkcs7_padding(text)

self.ciphertext=cryptor.encrypt(text)#因为AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题

#所以这里统一把加密后的字符串转化为16进制字符串

#return b2a_hex(self.ciphertext).decode().upper()

return(base64.b64encode(self.ciphertext))

@staticmethoddefpkcs7_padding(data):if notisinstance(data, bytes):

data=data.encode()

padder=padding.PKCS7(algorithms.AES.block_size).padder()

padded_data= padder.update(data) +padder.finalize()returnpadded_data

@staticmethoddefpkcs7_unpadding(padded_data):

unpadder=padding.PKCS7(algorithms.AES.block_size).unpadder()

data=unpadder.update(padded_data)try:

uppadded_data= data +unpadder.finalize()exceptValueError:raise Exception('无效的加密信息!')else:returnuppadded_data#解密后,去掉补足的空格用strip() 去掉

defdecrypt(self, text):#偏移量'iv'

cryptor =AES.new(self.key, self.mode, self.iv)

plain_text=cryptor.decrypt(base64.b64decode(text))#plain_text = cryptor.decrypt(a2b_hex(text))

#return plain_text.rstrip('\0')

return bytes.decode(plain_text).rstrip("\x01").\

rstrip("\x02").rstrip("\x03").rstrip("\x04").rstrip("\x05").\

rstrip("\x06").rstrip("\x07").rstrip("\x08").rstrip("\x09").\

rstrip("\x0a").rstrip("\x0b").rstrip("\x0c").rstrip("\x0d").\

rstrip("\x0e").rstrip("\x0f").rstrip("\x10")defdict_json(self, d):'''python字典转json字符串, 去掉一些空格'''j= json.dumps(d).replace('":', '":').replace(', "', ',"').replace(", {", ",{")returnj#加解密

if __name__ == '__main__':importjson

pc= PrpCrypt() #初始化密钥

a = "18511337566"

print("加密前:%s" %a)

b=pc.encrypt(a)print("解密后:%s" %b)

c=pc.decrypt(d)print(c)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值