我尝试在 CMAC 函数中使用 FIPS,但遇到版本冲突。我在 Visual Studio 2022、.NET Framework 4.8、C# 中引用了常规 BouncyCastle.Cryptography v2.0.0.0 和 bc-fips-1.0.2.dll V1.0.2 引用。 bc-fips-1.0.2 是参考,因为它有“BouncyCastle.Crypto.Fips”。
本质上有两个冲突,一个与“SecureRandom”冲突,另一个与“CryptoServicesRegistrar.CreateService”冲突。
错误:“CryptoServicesRegistrar”同时存在于“BouncyCastle.Cryptography,Version=2.0.0.0,Culture=neutral,PublicKeyToken=072edcf4a5328938”和“bc-fips-1.0.2,Version=1.0.2.0”中
有人知道解决方法或修复此问题吗?
我希望您能提前提供帮助。
您声明您正在使用 NuGet 包 BouncyCastle.Cryptography。如果点击 Project Website,就会被带到 BouncyCastle.org,在那里可以找到 bc-fips-1.0.2.dll。虽然这并不一定意味着它们都使用相同的命名空间,但错误消息表明它们确实如此。
“CryptoServicesRegistrar”类型存在于两者中 'BouncyCastle.Cryptography,版本=2.0.0.0,文化=中性, PublicKeyToken=072edcf4a5328938' 和 'bc-fips-1.0.2,版本=1.0.2.0, 文化=中立,PublicKeyToken=null'
这个问题在这篇post中有描述。
一种可能性是创建两个使用唯一命名空间的类库 - 一种包含使用 FIPS 版本的方法,另一种包含使用非 FIPS 版本的方法。
更理想的选择可能是在 .csproj 文件中使用别名,如本post中所述。
下载/安装 BouncyCastle.Cryptography 的 NuGet 包。
从这里下载 bc-fips.dll。
添加对 bc-fips.dll 的项目引用(项目 => 添加引用... => 浏览 => 单击浏览按钮...)
卸载项目或关闭 Visual Studio。
修改您的项目文件(.csproj)。
更改自:
<PackageReference Include="BouncyCastle.Cryptography" >
致:
<PackageReference Include="BouncyCastle.Cryptography" Aliases="NonFips">
注意:将 NonFips 更改为您喜欢的任何名称。
重新加载您的项目或在 Visual Studio 中再次打开您的项目。
在任何 using 指令之前添加以下内容:
extern alias NonFips;
构建/重建您的项目。
使用 non-fips 版本(即:BouncyCastle.Cryptography)中的方法时,请确保使用别名(即:NonFips 或任何您命名的别名)以及完全限定的命名空间方法如:
NonFips.Org.BouncyCastle.Crypto.CryptoServicesRegistrar.GetSecureRandom();