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

Grails jasypt加密字段的C#解密问题求助(BC算法)

正确的C#解密实现方案

jasypt的PBEWITHSHA256AND256BITAES-CBC-BC算法底层逻辑为:基于PBKDF2-HMAC-SHA256派生256位AES密钥,搭配AES-256-CBC模式与PKCS7填充,加密输出的Base64串包含8字节盐、16字节IV和密文三部分。以下是具体实现:

1. 依赖准备

安装BouncyCastle的NuGet包(兼容.NET标准库):

Install-Package BouncyCastle

或使用.NET CLI:

dotnet add package BouncyCastle

2. 完整解密代码

using System;
using System.Text;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;

public class JasyptAesDecryptor
{
    private const int SaltSize = 8;    // jasypt默认盐长度
    private const int IvSize = 16;     // AES-CBC固定IV长度
    private const int KeySize = 256;   // 256位AES密钥
    private const int Iterations = 1000; // 与grails-jasypt配置一致

    public static string Decrypt(string encryptedBase64, string password)
    {
        // 解码Base64加密串
        byte[] encryptedBytes = Convert.FromBase64String(encryptedBase64);
        
        // 拆分盐、IV、密文
        byte[] salt = new byte[SaltSize];
        byte[] iv = new byte[IvSize];
        byte[] ciphertext = new byte[encryptedBytes.Length - SaltSize - IvSize];
        
        Buffer.BlockCopy(encryptedBytes, 0, salt, 0, SaltSize);
        Buffer.BlockCopy(encryptedBytes, SaltSize, iv, 0, IvSize);
        Buffer.BlockCopy(encryptedBytes, SaltSize + IvSize, ciphertext, 0, ciphertext.Length);
        
        // PBKDF2-HMAC-SHA256派生密钥
        Pkcs5S2ParametersGenerator generator = new Pkcs5S2ParametersGenerator(new Sha256Digest());
        generator.Init(PbeParametersGenerator.Pkcs5PasswordToBytes(password.ToCharArray()), salt, Iterations);
        KeyParameter keyParam = (KeyParameter)generator.GenerateDerivedMacParameters(KeySize);
        
        // 初始化AES-CBC解密器
        IBufferedCipher cipher = CipherUtilities.GetCipher("AES/CBC/PKCS7Padding");
        cipher.Init(false, new ParametersWithIV(keyParam, iv));
        
        // 解密并转明文
        byte[] plaintextBytes = cipher.DoFinal(ciphertext);
        return Encoding.UTF8.GetString(plaintextBytes);
    }
}

3. 常见问题排查

  • "pad block corrupted"错误:多由以下原因导致:
    • 盐、IV、密文拆分位置错误(比如盐长度不是8字节)
    • 密钥派生的迭代次数、哈希算法与grails-jasypt配置不匹配
    • 密码输入错误
    • 加密/解密字符编码不一致(确保统一用UTF-8)
  • 解密结果乱码:检查字符编码是否与grails-jasypt加密时一致(默认UTF-8)
  • 算法名称问题:必须使用BouncyCastle的"AES/CBC/PKCS7Padding"命名,而非PKCS5Padding(虽16字节块下效果相同,但BouncyCastle命名要求更严格)

验证步骤

  1. 用grails-jasypt加密测试字符串(如"test1234")得到Base64密文
  2. 调用上述C#方法,传入密文和相同密码,确认返回原明文
  3. 若仍有问题,打印盐、IV、密文字节数组,对比Java端拆分逻辑是否一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:41:25