如何用Python实现Laravel的crypt加密与decrypt解密函数?
Laravel 对应 Python 加密函数实现
我已经实现了可正常运行的Laravel解密Python代码,现在需要编写对应的加密函数。现有解密代码如下:
import json import base64 from Crypto.Cipher import AES from Crypto.Util.Padding import unpad class decrypter: def __init__(cls, key): cls.key = key def decrypt(cls, text): decoded_text = json.loads(base64.b64decode(text)) iv = base64.b64decode(decoded_text['iv']) crypt_object = AES.new(key=cls.key, mode=AES.MODE_CBC, IV=iv) decoded = base64.b64decode(decoded_text['value']) decrypted = crypt_object.decrypt(decoded) return unpad(decrypted, 16).decode('utf-8') def decrypt_string(str): try: key = b"xxxx+xxxxxx+x+xxxx+xxxxx" key = base64.b64decode(key) msg = str obj = decrypter(key) decrypted = obj.decrypt(msg) return decrypted except Exception as e: logla.logla(e, "decrypt_string") print(e)
我曾找到一份声称实现Laravel加密的Python代码,但无法正常运行,该代码的核心逻辑翻译后如下:
原代码尝试实现Laravel的AES-CBC加密,流程为生成随机IV、对明文做PKCS7填充、用AES-CBC模式加密,再将IV和加密结果分别Base64编码,打包成JSON后整体Base64编码。但原代码存在填充逻辑错误、JSON打包格式不符合Laravel规范等问题,导致无法和Laravel加密结果兼容。
正确的Laravel兼容加密实现
以下是和现有解密代码匹配的加密函数实现:
import json import base64 from Crypto.Cipher import AES from Crypto.Util.Padding import pad from Crypto.Random import get_random_bytes class encrypter: def __init__(self, key): self.key = key def encrypt(self, text): # 生成16字节随机IV(Laravel AES加密固定使用16字节IV) iv = get_random_bytes(16) crypt_object = AES.new(key=self.key, mode=AES.MODE_CBC, IV=iv) # 明文UTF-8编码后做PKCS7填充,加密结果Base64编码 encrypted_bytes = crypt_object.encrypt(pad(text.encode('utf-8'), AES.block_size)) value = base64.b64encode(encrypted_bytes).decode('utf-8') # IV做Base64编码 iv_b64 = base64.b64encode(iv).decode('utf-8') # 按Laravel格式打包为JSON,再整体Base64编码 payload = json.dumps({'iv': iv_b64, 'value': value}) return base64.b64encode(payload.encode('utf-8')).decode('utf-8') def encrypt_string(text): try: key = b"xxxx+xxxxxx+x+xxxx+xxxxx" key = base64.b64decode(key) obj = encrypter(key) encrypted = obj.encrypt(text) return encrypted except Exception as e: logla.logla(e, "encrypt_string") print(e)
说明
- 加密流程严格遵循Laravel加密规范:采用AES-CBC模式、PKCS7填充、16字节随机IV,最终输出为包含
iv和value字段的JSON字符串再经Base64编码的结果。 - 需确保安装
pycryptodome库(可通过pip install pycryptodome完成),并正确导入pad和get_random_bytes工具类。
内容的提问来源于stack exchange,提问作者kaann.gunerr
相关产品推荐
相关产品推荐

