import hashlib
import binascii
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes


class EncryptUtil:
def init(self, key):
self.key = self.get_sha1prng_key(key) # 初始化密钥
self.length = AES.block_size # 数据块大小为 16 字节
self.unpad = lambda data: data[0:-ord(data[-1])] # 截断函数,去除填充字符

def get_sha1prng_key(self, key):
"""
使用 SHA1 方法生成随机数,对 key 进行处理,截取前 16 字节作为 AES-128 密钥。
"""
signature = hashlib.sha1(key.encode("utf-8")).digest()
signature = hashlib.sha1(signature).digest()
return signature[:16]

def pad(self, text):
"""
填充函数,使被加密数据长度是 block_size 的整数倍
"""
count = len(text.encode('utf-8'))
add = self.length - (count % self.length)
entext = text + (chr(add) * add)
return entext

def encrypt(self, originalData):
"""
AES-CBC 加密函数,返回 Base64 格式密文
"""
iv = get_random_bytes(16) # 随机生成 IV
cipher = AES.new(self.key, AES.MODE_CBC, iv) # CBC 模式加密
padded_data = self.pad(originalData).encode("utf8")
ciphertext = cipher.encrypt(padded_data)
encrypted_data = iv + ciphertext # 将 IV 和密文拼接
hex_string = binascii.b2a_hex(encrypted_data) # 转为十六进制字符串
return hex_string.decode().upper()

def decrypt(self, encryptedData):
"""
AES-CBC 解密函数,支持 Base64 格式密文
"""
encrypted_data = binascii.a2b_hex(encryptedData.encode("utf8")) # 转为二进制数据
iv = encrypted_data[:16] # 前 16 字节为 IV
ciphertext = encrypted_data[16:] # 剩余部分为密文
cipher = AES.new(self.key, AES.MODE_CBC, iv) # 创建 CBC 解密对象
padded_data = cipher.decrypt(ciphertext).decode("utf8")
return self.unpad(padded_data) # 去除填充字符


# 测试代码
if name == "main":
# 秘钥
secret = 'asdfasdasdfsdfasdf23434tgsdfhxcvau4IKf'
eg = EncryptUtil(secret)

# 明文
data = "14464614210中文的001"

# 加密
encrypt_data = eg.encrypt(data)
print("Original value: " + data)
print("Encrypted value: " + encrypt_data)

# 解密
decrypt_data = eg.decrypt(encrypt_data)
print("Decrypted value: " + decrypt_data)
 
 
Back to Top