记录之前做开发时用到的各类加密方法~
使用AES-ECB-CS5进行加解密
# -*- coding: utf-8 -*-
from base64 import b64decode
from Crypto.Cipher import AES
import base64
BLOCK_SIZE = 16
pad = lambda s: bytes(s +(BLOCK_SIZE - len(s) % BLOCK_SIZE) * chr(BLOCK_SIZE - len(s) % BLOCK_SIZE), encoding='utf8')
unpad = lambda s: s[:-ord(s[len(s) - 1:])]
class AESCipher:
def __init__(self, key):
self.key = key
def encrypt(self, raw):
raw = pad(raw)
cipher = AES.new(self.key, AES.MODE_ECB) # 通过key值,使用ECB模式进行加密
return base64.b64encode(cipher.encrypt(raw)).decode('utf8')
def decrypt(self, enc):
enc = b64decode(enc)
cipher = AES.new(self.key, AES.MODE_ECB)
return unpad(cipher.decrypt(enc)).decode('utf8')
if __name__ == '__main__':
key = b'd95ce9a7cae18529d9a29d66edb4c503'
name_data = AESCipher(key).encrypt('changhua')
pwd_data = AESCipher(key).encrypt('123456a')
print("name接口加密后的值是:", name_data)
print("pwd接口加密后的值是:", pwd_data)
扩展: AES有分对称加密和分组加密中的四种模式(ECB、CBC、CFB、OFB)
AES中几种加密模式的区别:ECB、CBC、CFB、OFB、CTR
AES:
aes是基于数据块的加密方式,也就是说,每次处理的数据时一块(16字节),当数据不是16字节的倍数时填充,这就是所谓的分组密码(区别于基于比特位的流密码),16字节是分组长度
分组加密的几种模式:
ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。
CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或或操作后再加密,这样做的目的是增强破解难度。
CFB/OFB:实际上是一种反馈模式,目的也是增强破解的难度。
FCB和CBC的加密结果是不一样的,两者的模式不同,而且CBC会在第一个密码块运算时加入一个初始化向量。
AES对称加密算法
# -*- coding: utf-8 -*-
import base64
from Crypto.Cipher import AES
'''
采用AES对称加密算法
'''
def add_to_16(value):
while len(value) % 16 != 0:
value += '\0'
return str.encode(value)
#加密方法
def encrypt_oracle():
key = 'd95ce9a7cae18529d9a29d66edb4c503' # 秘钥
text = 'changhua' # 待加密文本
aes = AES.new(add_to_16(key), AES.MODE_ECB)
encrypt_aes = aes.encrypt(add_to_16(text)) #先进行aes加密
encrypted_text = str(base64.encodebytes(encrypt_aes), encoding='utf-8') # 执行加密并转码返回bytes
print(encrypted_text)
#解密方法
def decrypt_oralce():
key = '123456'
text = 'qR/TQk4INsWeXdMSbCDDdA==' # 密文
aes = AES.new(add_to_16(key), AES.MODE_ECB) # 初始化加密器
base64_decrypted = base64.decodebytes(text.encode(encoding='utf-8')) #优先逆向解密base64成bytes
decrypted_text = str(aes.decrypt(base64_decrypted),encoding='utf-8').replace('\0','') #执行解密密并转码返回str
print(decrypted_text)
if __name__ == '__main__':
encrypt_oracle()
# decrypt_oralce()
使用MD5进行加解密
import hashlib
import time
# 待加密信息
loginname = '刘思'
password = "123456"
time = str(int(time.time())) # 时间戳
key = "c878494118404c89faa08d2aa0200470"
others = "&version=0.0.1&mac=GGNOY0D0Y3MM&platform=4&"
# 创建md5对象
loginname_hash = hashlib.md5()
pwd_hash = hashlib.md5()
# 注意:此处必须声明encode,若写法为hl.update(str) 报错为: Unicode-objects must be encoded before hashing
loginname_hash.update(loginname.encode(encoding='utf-8'))
pwd_hash.update(password.encode(encoding='utf-8'))
login = loginname_hash.hexdigest()
pwd = pwd_hash.hexdigest()
sign = "loginname=" + login + "&password=" + pwd + "&time=" + time + "&key=" + key + others
sign_hash = hashlib.md5()
sign_hash.update(sign.encode(encoding='utf-8'))
signs = sign_hash.hexdigest()
# print('MD5用户名称加密前为 :' + loginname)
# print('MD5用户名称加密后为 :' + loginname_hash.hexdigest())
# print('MD5密码加密后为 :' + pwd_hash.hexdigest())
print('MD5sign参数加密前为 :' + sign)
print('MD5sign参数加密后为 :' + sign_hash.hexdigest())
post_data = "loginname=" + login + "&password=" + pwd + "&sign=" + signs + "&time=" + time + others
print("最后上传数据形式是:" + post_data)
使用pyDes进行DES加解密
# coding: utf-8
import time
import binascii
import md5
import pyDes
IV = '0000000000000000'
KEY = '0011223344556677'
def encrypt(iv, key, data):
iv = binascii.unhexlify(iv)
key = binascii.unhexlify(key)
k = pyDes.des(key, pyDes.CBC, iv, pad=None, padmode=pyDes.PAD_PKCS5)
d = k.encrypt(data)
return binascii.b2a_hex(d)
def decrypt(iv, key, data):
iv = binascii.unhexlify(iv)
key = binascii.unhexlify(key)
k = pyDes.des(key, pyDes.CBC, iv, pad=None, padmode=pyDes.PAD_PKCS5)
data = binascii.a2b_hex(data)
d = k.decrypt(data)
return d
if __name__ == '__main__':
# Test
encryptdata = encrypt(IV, KEY, 'redice')
print encryptdata
decryptdata = decrypt(IV, KEY, encryptdata)
print decryptdata