python编写使用AES、MD5、DES进行加解密

记录之前做开发时用到的各类加密方法~

使用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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值