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

求助:.NET 4.8下BouncyCastle与bc-fips版本冲突致CMAC开发受阻

解决BouncyCastle与bc-fips的类型冲突问题

核心原则:避免同时引用两个库

BouncyCastle.Cryptography v2是通用密码库分支,bc-fips是专门的FIPS合规分支,两者部分命名空间、类型完全重叠,同时引用必然引发冲突。优先通过单一库满足需求:

方案1:仅用bc-fips实现FIPS合规CMAC

bc-fips本身已包含FIPS认证的CMAC实现,无需额外引用通用版BouncyCastle。操作步骤:

  • 移除项目中BouncyCastle.Cryptography v2.0.0.0的引用
  • 基于bc-fips的BouncyCastle.Crypto.Fips命名空间实现CMAC,示例代码:
using BouncyCastle.Crypto.Fips;
using BouncyCastle.Crypto.Parameters;

public byte[] ComputeFipsCmac(byte[] key, byte[] data)
{
    var keyParam = new KeyParameter(key);
    var cmac = FipsAes.Cmac.WithKey(keyParam).CreateMac();
    cmac.BlockUpdate(data, 0, data.Length);
    byte[] cmacResult = new byte[cmac.GetMacSize()];
    cmac.DoFinal(cmacResult, 0);
    return cmacResult;
}

方案2:程序集别名临时解决冲突(不推荐)

如果业务必须同时保留两个库,可通过程序集别名区分类型:

  1. 移除NuGet方式添加的bc-fips引用,改为手动将bc-fips-1.0.2.dll添加到项目(右键项目→添加→现有项)
  2. 选中项目中的bc-fips-1.0.2.dll,右键属性,将「别名」改为BCFIPS
  3. 在代码头部添加别名声明,明确区分两个库的类型:
extern alias BCFIPS;

// 使用bc-fips的FIPS合规类
using BCFIPS::BouncyCastle.Crypto.Fips;
// 使用通用BouncyCastle的其他类
using BouncyCastle.Cryptography;

此方法会增加代码维护成本,仅作为应急方案使用。

方案3:改用.NET Framework自带的FIPS合规API

.NET Framework 4.8原生支持FIPS模式,可使用System.Security.Cryptography下的AesCmac类实现,需确认系统已启用FIPS模式(组策略或注册表配置),示例代码:

using System.Security.Cryptography;

public byte[] ComputeCmacDotNet(byte[] key, byte[] data)
{
    using (var cmac = new AesCmac(key))
    {
        return cmac.ComputeHash(data);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:03:29