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) 收藏 举报
浙公网安备 33010602011771号