指定的初始化向量(IV)与此算法的块大小不匹配

时间:2013-02-22 07:45:12

标签: 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);
        }
    }

现在,这个代码每次运行时抛出异常,

  

指定的初始化向量(IV)与块大小不匹配   这个算法

我已经阅读过有关此内容的其他讨论,并说字节数存在问题(传递给此函数的密钥长度为255)。但我尝试只将密钥设为16个字节,但仍无法正常工作。

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

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

抛出异常。我不知道为什么。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:4)

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

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