python 加密解密

# -*- coding: utf-8 -*-
import base64
from Crypto.Cipher import AES


#用aes加密,再用base64  encode
def aes_encrypt(data): 
    key='8888888888888888'  #加密时使用的key,只能是长度16,24和32的字符串
    BS = AES.block_size
    pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
    cipher = AES.new(key)
    encrypted = cipher.encrypt(pad(data))  #aes加密
    result = base64.b64encode(encrypted)  #base64 encode
    return result 

#把加密的数据,用base64  decode,再用aes解密
def aes_decode(data):
    key='8888888888888888'
    # unpad = lambda s : s[0:-ord(s[-1])]
    unpad = lambda s : s[:-ord(s[len(s)-1:])]
    cipher = AES.new(key)
    result2 = base64.b64decode(data)
    decrypted = unpad(cipher.decrypt(result2))
    return  decrypted  

data = 'jibobo'  #需要加密的字符串
print(data)
res1 = aes_encrypt(data) #加密
res1 = str(res1,'utf-8')
print(res1)     #加密后的字符串
res2 = aes_decode(res1)  #解密
print(str(res2,'utf-8')) #解密后的字符串

2.python 3.8版本兼容:

# -*- coding: utf-8 -*-
import base64
from Crypto.Cipher import AES
 
 
#用aes加密,再用base64  encode
def aes_encrypt(data): 
    key=b'8888888888888888'  #加密时使用的key,只能是长度16,24和32的字符串
    BS = AES.block_size
    pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
    cipher = AES.new(key, AES.MODE_ECB)
    encrypted = cipher.encrypt(str.encode(pad(data)))  #aes加密
    result = base64.b64encode(encrypted)  #base64 encode
    return result 

#把加密的数据,用base64  decode,再用aes解密
def aes_decode(data):
    key=b'8888888888888888'
    unpad = lambda s : s[:-ord(s[len(s)-1:])]
    cipher = AES.new(key, AES.MODE_ECB)
    result2 = base64.b64decode(data)
    decrypted = unpad(cipher.decrypt(result2))
    return  decrypted  

if __name__ == '__main__':

    data = 'jibobo'  #需要加密的字符串
    print(data)
    res1 = aes_encrypt(data) #加密
    res1 = str(res1,'utf-8')
    print(res1)
    res2 = aes_decode(res1)  #解密
    print(str(res2,'utf-8')) #解密后的字符串

3.转载其他写的很好的python加密

#coding=utf-8
#AES AES/CBC/PKCS5|Zero
 
import base64
from Crypto.Cipher import AES
 
# pip install pycryptodome
 
'''
采用AES对称加密算法
'''
# str不是16的倍数那就补足为16的倍数. ZeroPadding
 
'''
    在PKCS5Padding中,明确定义Block的大小是8位
    而在PKCS7Padding定义中,对于块的大小是不确定的,可以在1-255之间
    PKCS #7 填充字符串由一个字节序列组成,每个字节填充该字节序列的长度。
    假定块长度为 8,数据长度为 9,
    数据: FF FF FF FF FF FF FF FF FF
    PKCS7 填充: FF FF FF FF FF FF FF FF FF 01 01 01 01 01 01 01   ?应该是填充01
    
    python3:填充bytes(这个说法不对,AES的参数是字符串,不是byte)
    length = 16 - (len(data) % 16)
    data += bytes([length])*length
 
    python2:填充字符串
    length = 16 - (len(data) % 16)
    data += chr(length)*length
    
    pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
    unpad = lambda s : s[0:-ord(s[-1])]
'''
 
class AES_CBC:
 
    def add_to_16(self, value):
        while len(value) % 16 != 0:
            value += '\0'
        return str.encode(value)  # 返回bytes
 
    #加密方法
    def encrypt_oracle(self, key, text):
        # iv=self.add_to_16(key)   #多了个iv
        # 偏移量 16个0
        iv = "0000000000000000"
        # 初始化加密器
        aes = AES.new(self.add_to_16(key), AES.MODE_CBC, self.add_to_16(iv))
        bs = AES.block_size
        pad2 = lambda s: s + (bs - len(s) % bs) * chr(bs - len(s) % bs)#PKS7 
    
        encrypt_aes = aes.encrypt(str.encode(pad2(text)))
    
        # 用base64转成字符串形式
        # 执行加密并转码返回bytes
        encrypted_text = str(base64.encodebytes(encrypt_aes), encoding='utf-8')  
        print(encrypted_text)
        #和js的 结果相同 http://tool.chacuo.net/cryptaes
        return encrypted_text
    
    #解密方法
    def decrypt_oralce(self, key, text):
        # 初始化加密器
        # 偏移量 16个0
        iv = "0000000000000000"
        aes = AES.new(self.add_to_16(key), AES.MODE_CBC, self.add_to_16(iv))
        #优先逆向解密base64成bytes
        base64_decrypted = base64.decodebytes(text.encode(encoding='utf-8'))
        #
        decrypted_text = str(aes.decrypt(base64_decrypted), encoding='utf-8') # 执行解密密并转码返回str
        unpad = lambda s : s[0:-ord(s[-1])]
        #PADDING = '\0'
        #print decrypted_text.rstrip(PADDING)  #zeropadding只见诶去掉结尾\0
        # print(unpad(decrypted_text))
        return unpad(decrypted_text)
 
 
if __name__ == '__main__':
    aes = AES_CBC()
    #加密
    key = "8888888888888888"
    enc_text = aes.encrypt_oracle(key, "jibobo")
 
    #解密
    dec_text = aes.decrypt_oralce(key, enc_text)
    print(key)
    print(enc_text)
    print(dec_text)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值