AES C# 加密解密 FIPS

本文关键字:FIPS 加密解密 AES | 更新日期: 2023-09-27 18:31:44

我正在尝试执行以下测试以返回应返回特定密码的结果。它们提供密钥、IV 和纯文本字符串,如下所示。

但是我得到"指定的初始化向量 (IV) 与此算法的块大小不匹配"。

我被困了一段时间,找不到一个很好的简单例子,并尝试了多种组合。

下面是我的 C# 代码。我试图保持非常简单。

 string AesPlainText = "1654001d3e1e9bbd036a2f26d9a77b7f"; 
        string AesKey = "3ccb6039c354c9de72adc9ffe9f719c2c8257446c1eb4b86f2a5b981713cf998";
        string AesIV = "ce7d4f9679dfc3930bc79aab81e11723";
        AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
        aes.KeySize = 256;
        aes.IV = HexToByteArray(AesIV);
        aes.Key = HexToByteArray(AesKey);
        aes.Mode = CipherMode.CBC;
        // Convert string to byte array
        byte[] src = Encoding.Unicode.GetBytes(AesPlainText);
        // encryption
        using (ICryptoTransform encrypt = aes.CreateEncryptor())
        {
            byte[] dest = encrypt.TransformFinalBlock(src, 0, src.Length);
            // Convert byte array to Base64 strings
            Console.WriteLine(Convert.ToBase64String(dest));
        }

根据答案更新:

谢谢,很好的观察。在上面的示例中,我将Encoding.UTF8.GetBytes更改为使用HexToByteArray,它现在可以工作了。

public static byte[] HexToByteArray(String hex)
{
    int NumberChars = hex.Length;
    byte[] bytes = new byte[NumberChars / 2];
    for (int i = 0; i < NumberChars; i += 2)
        bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
    return bytes;
}

AES C# 加密解密 FIPS

您的明文、键和 IV 似乎以十六进制指定,因此您需要解码十六进制以获得底层字节,而不是执行 UTF8 编码。

你可以在这里从十六进制中获取一个字节数组。请注意,方法的名称应该包含十六进制,不要称其为StringToByteArrayatoi或类似愚蠢的东西。