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

如何在Salesforce Apex中实现AES 128 ECB模式加解密?求替代方案

实现AES-128 ECB加解密的替代方案

由于Salesforce官方的Crypto类不支持ECB模式,你可以通过以下两种可行方案实现需求:

方案一:基于内置Crypto类模拟ECB模式

ECB模式的核心是将明文分割为16字节(AES-128块大小)的独立块,对每个块单独加密,无链式依赖。利用Crypto类支持的AES-CBC模式,通过对每个块使用全零IV加密,即可模拟ECB的效果(CBC模式下用全零IV且不链式处理每个块,等价于ECB)。

加密步骤:

  1. 对明文进行PKCS#7填充,确保长度为16字节的整数倍。
  2. 将填充后的明文分割为16字节的块。
  3. 对每个块使用Crypto.encrypt('AES128', key, Blob.valueOf('\0'.repeat(16)), block)加密(全零IV)。
  4. 拼接所有加密后的块得到最终密文。

解密步骤:

  1. 将密文分割为16字节的块。
  2. 对每个块使用Crypto.decrypt('AES128', key, Blob.valueOf('\0'.repeat(16)), block)解密。
  3. 拼接所有解密后的块,再去除PKCS#7填充得到明文。

示例代码:

public class AES_ECB {
    private static final Integer BLOCK_SIZE = 16;

    // PKCS#7填充
    private static Blob pad(Blob input) {
        Integer padLength = BLOCK_SIZE - (input.size() % BLOCK_SIZE);
        String padString = String.fromCharArray(new List<Integer>(new Integer[padLength]).clone().fill(padLength));
        return Blob.valueOf(Blob.toString(input) + padString);
    }

    // 去除PKCS#7填充
    private static Blob unpad(Blob input) {
        String inputStr = Blob.toString(input);
        Integer padLength = (Integer)inputStr.charAt(inputStr.length() - 1);
        return Blob.valueOf(inputStr.substring(0, inputStr.length() - padLength));
    }

    // AES-128 ECB加密
    public static Blob encrypt(Blob key, Blob plaintext) {
        Blob paddedPlaintext = pad(plaintext);
        List<Blob> cipherBlocks = new List<Blob>();
        Blob zeroIV = Blob.valueOf('\0'.repeat(BLOCK_SIZE));

        for (Integer i = 0; i < paddedPlaintext.size(); i += BLOCK_SIZE) {
            Blob block = paddedPlaintext.substring(i, Math.min(i + BLOCK_SIZE, paddedPlaintext.size()));
            Blob encryptedBlock = Crypto.encrypt('AES128', key, zeroIV, block);
            cipherBlocks.add(encryptedBlock);
        }

        // 拼接所有块
        String cipherStr = '';
        for (Blob b : cipherBlocks) {
            cipherStr += Blob.toString(b);
        }
        return Blob.valueOf(cipherStr);
    }

    // AES-128 ECB解密
    public static Blob decrypt(Blob key, Blob ciphertext) {
        List<Blob> plainBlocks = new List<Blob>();
        Blob zeroIV = Blob.valueOf('\0'.repeat(BLOCK_SIZE));

        for (Integer i = 0; i < ciphertext.size(); i += BLOCK_SIZE) {
            Blob block = ciphertext.substring(i, Math.min(i + BLOCK_SIZE, ciphertext.size()));
            Blob decryptedBlock = Crypto.decrypt('AES128', key, zeroIV, block);
            plainBlocks.add(decryptedBlock);
        }

        // 拼接所有块并去填充
        String plainStr = '';
        for (Blob b : plainBlocks) {
            plainStr += Blob.toString(b);
        }
        return unpad(Blob.valueOf(plainStr));
    }
}

方案二:手动实现AES算法

如果方案一无法满足边缘场景需求,可以手动在Apex中实现完整的AES-128算法(包括ECB模式)。不过这种方式代码量较大,需严格遵循AES规范,容易引入安全漏洞,仅推荐在必要时使用。

注意事项:

  • ECB模式存在严重安全隐患(相同明文块会生成相同密文块,易被破解),若有可能,建议与外部API方协商改用更安全的模式(如CBC、GCM)。
  • 确保密钥长度为16字节(AES-128要求),且密钥管理符合Salesforce安全规范(避免硬编码,使用自定义设置或命名凭据存储)。

内容的提问来源于stack exchange,提问作者Leandro Petri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 12:26:32