You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 20:50:23