use*_*495 2 c# cryptography exception
我正在尝试用 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);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,这段代码每次运行时都会抛出异常,说
指定的初始化向量 (IV) 与此算法的块大小不匹配
我读过其他关于这个的讨论,说字节数有问题(我传递给这个函数的密钥长度是 255)。但是我尝试将密钥设置为仅 16 个字节,但仍然无法正常工作。
经过一些故障排除后,我发现这部分:
CryptoStream cs = new CryptoStream(fsEncrypt, rmCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write);
抛出异常。我不知道为什么。任何人都可以帮忙吗?
您将密钥两次传递给CreateEncryptor,但它需要一个密钥和一个 IV(初始化向量)。第二个参数应该是一个包含 128 个随机位的数组。128 位是 RijndaelManaged 的默认块大小,但它也接受其他值(例如 256)。阅读本文了解更多信息。正如 Grzegorz W 在评论中指出的那样,您可能还需要选择不同的密钥大小。
如果您不熟悉加密(在这种情况下,您应该在实施自己的解决方案之前停下来了解更多信息,或者使用现成的来代替),IV的功能是防止同一消息编码两次产生相同的密文。对于每条消息(以及消息的每次使用),它应该是随机的,不需要保密,但是您需要存储它以便以后能够解密该消息(即加密后不能丢弃它)。