[英]Specified initialization vector (IV) does not match the block size for this algorithm
[英]Specified initialization vector(IV) does not match the block size for this algorithm
我正在尝试使用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);
抛出异常。 我不知道为什么。 有人可以帮忙吗?
您将密钥传递两次到CreateEncryptor
,但它需要一个密钥和一个IV( 初始化向量 )。 第二个参数应该是一个包含128个随机位的数组。 128位是RijndaelManaged的默认块大小,但它也接受其他值(例如256)。 阅读本文以获取更多信息。 正如Grzegorz W在评论中指出的那样,您可能还需要选择不同的密钥大小 。
如果您不熟悉加密(在这种情况下,您应该在实现自己的解决方案之前停止并了解更多信息,或者使用现成的解决方案), IV的功能是防止相同的消息编码两次产生相同的密文。 它应该是随机的每条消息(以及消息的每次使用),不需要保密,但你需要存储它以便以后能够解密消息(即加密后你不能丢弃它)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.