遗漏的部分
This commit is contained in:
1 parent
84fb370da8
commit
0493383ee8
63 files changed
+28237
-4
No files matched your search
@@ -0,0 +1,85 @@
|
||||
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
|
||||
from cryptography.hazmat.backends import default_backend
|
||||
from cryptography.hazmat.primitives import padding
|
||||
class MyAES:
|
||||
def __init__(self, key: str, iv: str):
|
||||
self.key: bytes = bytes.fromhex(key)
|
||||
self.iv: bytes = bytes.fromhex(iv)
|
||||
def decrypt(self, ciphertext: str):
|
||||
cipher: bytes = bytes.fromhex(ciphertext)
|
||||
plain: bytes = MyAES.aes_decrypt(cipher, self.key, self.iv)
|
||||
try:
|
||||
return plain.decode('utf-8')
|
||||
except UnicodeDecodeError as e:
|
||||
# 返回原始字节的十六进制表示作为备选
|
||||
return plain.hex()
|
||||
def encrypt(self, original_text: str):
|
||||
plaintext: byte = original_text.encode('utf-8')
|
||||
ciphertext: byte = MyAES.aes_encrypt(plaintext, self.key, self.iv)
|
||||
return ciphertext.hex()
|
||||
@staticmethod
|
||||
def aes_decrypt(ciphertext: bytes, key: bytes, iv: bytes) -> bytes:
|
||||
"""
|
||||
使用AES-256-CBC算法解密数据
|
||||
|
||||
参数
|
||||
- ciphertext: 待解密的密文字节串
|
||||
- key: 256位(32字节)的密钥字节串
|
||||
- iv: 初始化向量字节串(必须为16字节)
|
||||
|
||||
返回:
|
||||
- 解密后的明文字节串
|
||||
"""
|
||||
|
||||
# 验证输入参数长度
|
||||
if len(key) != 32:
|
||||
raise ValueError('AES-256密钥必须是32字节长度')
|
||||
if len(iv) != 16:
|
||||
raise ValueError('AES-CBC的IV必须是16字节长度')
|
||||
|
||||
# 创建AES-CBC解密器
|
||||
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())
|
||||
decryptor = cipher.decryptor()
|
||||
|
||||
try:
|
||||
# 执行解密并移除PKCS#7填充
|
||||
plaintext = decryptor.update(ciphertext) + decryptor.finalize()
|
||||
return plaintext
|
||||
except Exception as e:
|
||||
print(f"解密失败:{e}")
|
||||
return b''
|
||||
|
||||
@staticmethod
|
||||
def aes_encrypt(plaintext: bytes, key: bytes, iv: bytes) -> bytes:
|
||||
"""
|
||||
AES-256-CBC 加密
|
||||
|
||||
参数
|
||||
plaintext: 要加密的密文
|
||||
key: 32字节的密钥
|
||||
iv: 16字节的初始化向量
|
||||
返回:
|
||||
加密后的密文
|
||||
"""
|
||||
# 检查密钥和IV的长度
|
||||
if len(key) != 32:
|
||||
raise ValueError("密钥必须是32字节(AES-256)")
|
||||
if len(iv) != 16:
|
||||
raise ValueError("IV必须是16字节")
|
||||
|
||||
# 创建加密器
|
||||
cipher = Cipher(
|
||||
algorithms.AES(key),
|
||||
modes.CBC(iv),
|
||||
backend=default_backend()
|
||||
)
|
||||
encryptor = cipher.encryptor()
|
||||
|
||||
# 添加PKCS7填充
|
||||
padder = padding.PKCS7(128).padder()
|
||||
padded_data = padder.update(plaintext) + padder.finalize()
|
||||
|
||||
# 加密数据
|
||||
ciphertext = encryptor.update(padded_data) + encryptor.finalize()
|
||||
|
||||
return ciphertext
|
||||
Reference in new issue
Block a user