crypto模块:AES或DES加密算法,MD5或SHA摘要算法(hash算法)

# AES加密算法
from
Crypto.Cipher import AES
import base64 from binascii import b2a_hex, a2b_hex, b2a_base64, a2b_base64 def aesEncrypt(text, key='abcdef2323', mode=AES.MODE_ECB, long="AES_128", padding='{', encode='base64'): u""" :param text: 要加密的明文字符串 :param key: 自定义密钥的明文字符串。必须是密钥长度的整数倍,否则也要用padding补码 :param mode: 选择的加密模式,ECB:电子密码本模式,CBC:加密块链模式,CFB:加密反馈模式,OFB:输出反馈模式 :param long: 选择的加密长度,"AES_128":密钥长度为128比特bit==16字节bytes,即密钥分组长度16bytes字节; "AES_192":密钥长度为192比特bit==24字节bytes,即密钥分组长度16bytes字节; "AES_256":密钥长度为256比特bit==32字节bytes,即密钥分组长度16bytes字节; AES加密算法的分组长度必须是128bits :param padding: 选择的补码字符 :param encode: 选择加密结果的编码方式 :return: 加密后的大写密文 """ # crypto:秘密成员,cipher:密码,用密码书写 # 1.获取密钥长度: length = 0 if long == "AES_128": length = 16 elif long == "AES_256": length = 24 # 2.如果要加密的明文字符串text不是密钥长度的整数倍,不足的位补码,补上padding add_length = length - len(text) % length pad = lambda s: s + (add_length * padding if add_length != 0 else '') text = pad(text) # 3.初始化AES加密类 cipher = AES.new(key, mode) # 4. 加密 encrypt_buff = cipher.encrypt(text) # 5.将密文编码为16位或64位 # 因为AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题,#所以这里统一把加密后的字符串转化为16或64进制字符串 if encode == "base64": # encrypt_buff = base64.b64encode(encrypt_buff) encrypt_buff = b2a_base64(encrypt_buff) else: # 加密后的字符串转化为16进制字符串 encrypt_buff = b2a_hex(encrypt_buff) return encrypt_buff.upper().strip() def aesDecrypt(text, key='abcdef2323', mode=AES.MODE_ECB, padding='{', encode='base64'): # 1.解码,将16或64位的ascii密文解码 if encode == "base64": # decrypt_buff = base64.b64decode(text) decrypt_buff = a2b_base64(text) else: # 加密后的字符串转化为16进制字符串 decrypt_buff = a2b_hex(text) # 2.初始化AES,解密 cipher = AES.new(key, mode) plain_text = cipher.decrypt(decrypt_buff) # 3.去掉补码 plain_text = plain_text.strip().strip(padding) return plain_text

 再来一个加密示例:

from Crypto.Cipher import AES

# padding算法
BS = 16
pad = lambda s: s + (BS - len(s) % BS) * chr(0) 
unpad = lambda s : s[0:-ord(s[-1])]

# 将字符串转换成二进制的buff块
def parse_hex(hex_str):
    l=int(math.ceil(len(hex_str)/2))
    buf=''
    for i in range(0,l):
        s=hex_str[(i*2):((i+1)*2)]
        buf=buf+chr(int(s,16))
    return buf

# 解析加密的key
key=parse_hex("68b329da9893e34099c7d8ad5cb9c940")
iv=parse_hex("68b329da9893e34099c7d8ad5cb9c940")

# 新建一个AES的对象
aes_obj = AES.new(key, AES.MODE_CBC,iv)

# 做字节对齐
padding_zero=pad(raw_buf)

# 开始加密
encrypt_buf=aes_obj.encrypt(padding_zero)

# 解密
buff=aes_obj.decrypt(encrypt_buf)

 

 

HASH摘要算法:

from Crypto.Hash import MD5,SHA256
m = MD5.new()
m.update('pwd123')
m.hexdigest()
#     OUT:  '45cb41b32dcfb917ccd8614f1536d6da'

 

 不论何语言,何模块,得到的各种摘要算法和加密算法的结果是一样的:'45cb41b32dcfb917ccd8614f1536d6da'

import hashlib
m1=hashlib.md5()
m1.update('pwd123')
m.hexdigest()
#   OUT:    '45cb41b32dcfb917ccd8614f1536d6da'

 

posted on 2018-04-04 15:34  myworldworld  阅读(854)  评论(0)    收藏  举报

导航