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

2630

被折叠的 条评论
为什么被折叠?



