python 加密和摘要算法

本文介绍了使用pycryptodome库进行3DES和AES加密解密的方法,包括ECB模式和CBC模式,并展示了HMAC-MD5的摘要生成及验证过程。通过示例代码详细解释了加密和解密的步骤,适用于数据安全领域的实践应用。

pycryptodome库

3DES 3重DES 三重DES 3DES加密 3DES解密

import base64
from Crypto.Cipher import DES3
from Crypto.Util.Padding import pad, unpad
"""
3DES ECB模式 pkcs7填充方式加密
key : 密钥,长度必须为16或24字节  ,使用16字节会退化为单一DES
data : 待加密的字符串
DES3.block_size 值为8,表示数据块填充边界,该参数必须为DES3.block_size 的整数倍(可直接写数字)
不填充的话,如果数据长度不为16的整数倍,则会报错"Data must be aligned to block boundary in ECB mod"
"""
def DES_ENCRYPT(key,data):
    cipherEncrypt = DES3.new(key.encode(), DES3.MODE_ECB)
    encrytext=cipherEncrypt.encrypt(pad(data.encode('utf-8'), DES3.block_size, style='pkcs7'))
    #以base64格式输出会多一个\n,解码成字符串后要替换掉,也可以16进制输出
    #return encrytext.hex()
    return base64.encodebytes(encrytext).decode().replace('\n','')
    #上面写法等同于
    #  return str(base64.encodebytes(encrytext), encoding='utf-8').replace("\n", "")    
"""
3DES ECB模式 pkcs7填充方式解密
data : 被加密的字符串(base64编码后的)
解密无需指定填充模式以及填充边界
解密之的结果要用unpad把之前的填充去掉,返回原字符串
"""
def DES_DECRYPT(key,data):
    cipherDecrypt = DES3.new(key.encode(), DES3.MODE_ECB)
    decrytext=cipherDecrypt.decrypt(base64.decodebytes(data.encode('utf-8')))
    return (unpad(decrytext, DES3.block_size)).decode('utf-8')
encrytext=DES_ENCRYPT('d5e385435f0b901fb7b5d3ba','123')
decrytext=DES_DECRYPT('d5e385435f0b901fb7b5d3ba',encrytext)
print(f'encrytext:{encrytext},decrytext:{decrytext}')
DES_DECRYPT('d5e385435f0b901fb7b5d3ba','MX/Q0NARK0+Of7LNWOOoPqNOtk4YEUow/1/tWt0X2jBEm8clj2DQnEq9mSsLO8Wv')

AES加密 AES解密

AES CBC模式

from Crypto.Util.Padding import pad, unpad
from Crypto.Cipher import AES
import base64
'''
偏移量iv必须为16字节长度,且只能是ASCII字符,注意UTF-8中一个中文字符占用3个字节
key的长度为16,24,32字节
AES.block_size值是16
'''
def AES_ENCRYPT(key,iv,data):
    encryptcipher= AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8'))
    encrytext=encryptcipher.encrypt(pad(data.encode('utf-8'), AES.block_size, style='pkcs7'))
    return base64.encodebytes(encrytext).decode().replace('\n','')
def AES_DECRYPT(key,iv,data):
    cipherDecrypt = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8'))
    decrytext=cipherDecrypt.decrypt(base64.decodebytes(data.encode('utf-8')))
    return (unpad(decrytext, AES.block_size)).decode('utf-8')    
key='12345678123456781234567812345678'
iv='1234567812345?'
data='123'
encryptext=AES_ENCRYPT(key,iv,data)
decryptext=AES_DECRYPT(key,iv,encryptext)
print(f'encryptext:{encryptext},decryptext:{decryptext}')

Hmac-MD5摘要 HmacMD5摘要

from Crypto.Hash import HMAC, MD5
def HMAC_MD5(key,data):
    h = HMAC.new(key.encode('utf-8'), digestmod=MD5)
    h.update(data.encode('utf-8'))
    return h.hexdigest()
print(HMAC_MD5('123456','hello'))  #结果为:  9c699d7af73a49247a239cb0dd2f8139

验证密钥是否和摘要文本是否匹配,即判断原文本是否发生修改

from Crypto.Hash import HMAC, MD5
secret = b'123456'
msg=b'hello'
mac='9c699d7af73a49247a239cb0dd2f8139'
h = HMAC.new(secret, digestmod=MD5)
h.update(msg)
try:
  h.hexverify(mac)
  print("The message '%s' is authentic" % msg)
except ValueError:
  print("The message or the key is wrong")

MD5

from Crypto.Hash import MD5
def digest_md5(text):
    h = MD5.new()
    h.update(text.encode())
    return h.hexdigest()
digest_md5('123')

hmac库

hmac-md5

key是密钥,message是待hash的字符串,都要以byte形式传入

import hmac
message = b'123'
key = b'fpMn12&38f_2e'
h = hmac.new(key, message,digestmod='MD5')
print(h.hexdigest())
h1 = hmac.new(key, digestmod='MD5')
# 如果消息很长,可以多次调用h.update(msg)  m.update(a); m.update(b) 等价于 m.update(a+b)
h1.update(b'12')
h1.update(b'3')
print(h1.hexdigest())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值