qq_34960459 2025-08-29 11:08 采纳率: 0%
浏览 12

各位,谁能帮我解决,困扰几天了,程序一直过不了。

各位,谁能帮我解决,困扰几天了,程序一直过不了。
System.TypelnitializationException:“AESKey"的类型初始值设走项引发异常。--->System.InvalidOperationException: 此实现不是 Windows 平台FIPS 验证的加密算法的一部分。

img

  • 写回答

6条回答 默认 最新

  • 檀越@新空间 2025-08-29 11:09
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    你遇到的错误信息是:

    System.TypelnitializationException:“AESKey"的类型初始值设走项引发异常。--->System.InvalidOperationException: 此实现不是 Windows 平台FIPS 验证的加密算法的一部分。
    

    这个错误通常出现在使用 .NET 框架进行加密操作时,尤其是在启用了 FIPS(Federal Information Processing Standard) 验证的系统上。以下是详细的解释和解决方案。


    ✅ 问题原因分析

    1. FIPS 验证启用

    Windows 系统中如果启用了 FIPS 验证,那么所有加密操作必须使用符合 FIPS 标准的算法。而默认的 AesManaged 类可能不被 FIPS 认可,因此会抛出异常。

    2. AES 加密算法未通过 FIPS 验证

    .NET 中的 AesManaged 实现虽然功能正常,但没有通过 FIPS 验证,因此在启用了 FIPS 的系统中无法使用。


    🔧 解决方案

    ✅ 方法一:禁用 FIPS 验证(推荐用于开发环境)

    ⚠️ 注意:生产环境中不建议关闭 FIPS 验证,这可能会导致安全合规性问题。

    步骤如下:

    1. 打开注册表编辑器(regedit)。
    2. 定位到以下路径:
      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
      
    3. 右键空白处 → 新建 → DWORD (32-bit) 值,命名为 FIPSAlgorithmPolicy
    4. 设置其值为 0(表示禁用 FIPS 验证)。
    5. 重启计算机使设置生效。

    注意: 这种方式适用于开发或测试环境,不建议用于生产环境


    ✅ 方法二:使用符合 FIPS 的加密算法(推荐用于生产环境)

    你可以使用 AesCryptoServiceProvider 替代 AesManaged,因为它是基于 Windows CryptoAPI 的实现,通常通过 FIPS 验证

    示例代码(C#):

    using System;
    using System.IO;
    using System.Security.Cryptography;
    
    public class AesEncryption
    {
        public static byte[] Encrypt(byte[] plainText, byte[] key, byte[] iv)
        {
            using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
            {
                aes.Key = key;
                aes.IV = iv;
                aes.Mode = CipherMode.CBC;
                aes.Padding = PaddingMode.PKCS7;
    
                ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
    
                using (MemoryStream ms = new MemoryStream())
                {
                    using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
                    {
                        cs.Write(plainText, 0, plainText.Length);
                    }
                    return ms.ToArray();
                }
            }
        }
    
        public static byte[] Decrypt(byte[] cipherText, byte[] key, byte[] iv)
        {
            using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
            {
                aes.Key = key;
                aes.IV = iv;
                aes.Mode = CipherMode.CBC;
                aes.Padding = PaddingMode.PKCS7;
    
                ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
    
                using (MemoryStream ms = new MemoryStream(cipherText))
                {
                    using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
                    {
                        byte[] result = new byte[cipherText.Length];
                        int bytesRead = cs.Read(result, 0, result.Length);
                        Array.Resize(ref result, bytesRead);
                        return result;
                    }
                }
            }
        }
    }
    

    重点说明:

    • 使用 AesCryptoServiceProvider 而不是 AesManaged
    • 在 FIPS 启用的系统中,这种实现通常是符合 FIPS 标准的。

    ✅ 方法三:检查并修改项目配置(针对 .NET Core / .NET 5+)

    如果你使用的是 .NET Core 或 .NET 5+,可以尝试在 appsettings.jsonlaunchSettings.json 中添加以下配置:

    {
      "RuntimeOptions": {
        "Configuration": "Release",
        "Framework": {
          "Name": "Microsoft.NETCore.App",
          "Version": "3.1.0"
        },
        "ApplicationArguments": "--no-fips"
      }
    }
    

    注意: 该选项可能因 .NET 版本不同而有所变化,需根据具体版本查阅官方文档。


    🛠 总结

    | 问题 | 解决方案 | |------|----------| | FIPS 验证启用导致 AES 报错 | 禁用 FIPS(仅限开发环境) | | 使用非 FIPS 兼容的 AES 实现 | 替换为 AesCryptoServiceProvider | | .NET Core/5+ 中的 FIPS 问题 | 检查运行时配置并调整 |


    如果你能提供你的代码片段,我可以帮你更准确地定位问题并给出修改后的代码。欢迎继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 8月29日