c# - 指定的初始化向量 (IV) 与该算法的 block 大小不匹配

标签 c# exception cryptography

我正在尝试使用 C# 制作一个加密系统。这是加密的代码。

public static void EncryptFile(string inFile, string outFile, string @inkey)
    {
        try
        {
            UnicodeEncoding ue = new UnicodeEncoding();
            byte[] key = ue.GetBytes(inkey);
            FileStream fsEncrypt = new FileStream(outFile, FileMode.Create);

            RijndaelManaged rmCrypto = new RijndaelManaged();

            CryptoStream cs = new CryptoStream(fsEncrypt, rmCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write);
            FileStream fsIn = new FileStream(inFile, FileMode.Open);

            int data;
            while((data=fsIn.ReadByte()) != 1){
                cs.WriteByte((byte)data);
            }

            fsIn.Close(); cs.Close(); fsEncrypt.Close();
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.Message, "Fail to encrypt", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

现在,每次我运行这段代码都会抛出异常,

Specified initialization vector(IV) does not match the block size for this algorithm

我看过其他关于这个的讨论,说字节数有问题(我传递给这个函数的 key 长度是255)。但我已尝试将 key 设置为只有 16 个字节,但仍然无法正常工作。

经过一些故障排除后,我发现这部分:

CryptoStream cs = new CryptoStream(fsEncrypt, rmCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write);

抛出异常。我不知道为什么。谁能帮忙?

最佳答案

您将 key 传递给 CreateEncryptor 两次, 但它需要一个 key 和一个 IV ( Initialization Vector )。第二个参数应该是一个包含 128 个随机位的数组。 128 位是 RijndaelManaged 的​​默认 block 大小,但它也接受其他值(例如 256)。阅读this获取更多信息。正如 Grzegorz W 在评论中指出的那样,您可能需要选择 different key size

如果您不熟悉加密(在这种情况下,您应该在实现自己的解决方案之前停下来了解更多相关信息,或者改用现成的解决方案),function of the IV是防止相同的消息编码两次产生相同的密文。每条消息(以及消息的每次使用)应该是随机的,不需要保密,但您需要存储它以便以后能够破译消息(即加密后不能丢弃它)。

关于c# - 指定的初始化向量 (IV) 与该算法的 block 大小不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15019236/

相关文章:

c# - 创建所有可能的数组而不使用嵌套 for 循环

c# - 使用 ManagedInstallerClass 安装 C# 服务

c# - 使用简单注入(inject)器的不同配置

java - 系统异常与应用程序异常的清晰解释

java - Android 抛出 DeadObjectException : Transaction failed on small parcel; remote process probably died just in HUAWEI Android 8. 0.0

swift - 为什么 MD5 散列如此困难并且在 Swift 3 中?

security - 如何防御TabNabbing?

c# - 在 Amazon S3 放置请求 (request.AddHeader) 上设置过期 header 时 AppHarbor 生成错误

java - 如何获取数据源?

java - 从 RSA 编码的 AES key 生成 AES key