Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正确的C#Rijndael IV使用/储存_C#_Bytearray_Rijndael_Initialization Vector - Fatal编程技术网

正确的C#Rijndael IV使用/储存

正确的C#Rijndael IV使用/储存,c#,bytearray,rijndael,initialization-vector,C#,Bytearray,Rijndael,Initialization Vector,下午, 所以我对所有这些加密方法和用法都相当陌生。我刚刚开始构建一个加密实现。现在我的加密和解密方法似乎运行良好。。直到我读到这篇文章之前,我在RijndaelManaged类中使用了硬编码IV,结果惨败 我到处都在读,最好(也更安全)在“加密时间”唯一地生成每个加密文件的IV,并将其保存在文件的前面/开头,其他加密字节在此之后直接保存。 (如果我理解正确) 我一直在努力解决我的问题,因为每次我加密一个文件时,我都会将IV写入文件的前16个字节(正如类、MSDN、Google和本论坛上的一些人所

下午,

所以我对所有这些加密方法和用法都相当陌生。我刚刚开始构建一个加密实现。现在我的加密和解密方法似乎运行良好。。直到我读到这篇文章之前,我在RijndaelManaged类中使用了硬编码IV,结果惨败

我到处都在读,最好(也更安全)在“加密时间”唯一地生成每个加密文件的IV,并将其保存在文件的前面/开头,其他加密字节在此之后直接保存。 (如果我理解正确)

我一直在努力解决我的问题,因为每次我加密一个文件时,我都会将IV写入文件的前16个字节(正如类、MSDN、Google和本论坛上的一些人所建议的),然后直接将其余加密字节写入文件流。(IV保存为纯文本..或未加密的字节<也可以吗?)

我的问题是,当我尝试使用与失败的密钥完全相同的密钥解密文件时:在开始读取文件块进行解密(缓冲)之前,我尝试读取明文IV文件的前16个字节,并在RijndaelManaged类实例中使用它

// Effectively reading the persisted value into a temporary array
// and throwing away the temporary.
int Read = StreamIN.Read(RM.IV, 0, 16);
这似乎失败了。我检查了一下,我想我可能在某个地方犯了一些小学生的错误:因为我似乎无法从加密文件中读取相同的16字节,一旦我想要解密它

这是我用来在加密之前处理文件的代码(不是加密本身)


使用(RijndaelManaged RM=new RijndaelManaged())
使用(FileStream StreamIN=newfilestream(FileIN,FileMode.Open,FileAccess.Read))
使用(FileStream StreamOUT=newfilestream(FileOUT,FileMode.Append,FileAccess.Write))
{
//设置变量ChunkSize和读取到流中的总字节数
int ChunkSize=1024*1024*32;
RM.GenerateIV();
foreach(第四RM中的var项目)
{
控制台。写入(“[”+项+“]”);
}
StreamOUT.Seek(0,SeekOrigin.Begin);
精简写入(RM.IV,0,RM.IV.Length);
StreamOUT.Seek(RM.IV.Length,SeekOrigin.Begin);
int TotalBytesRead=0;
//文件缓冲区实现
用于(长i=0;i0)
{
//从本地类调用加密
WriteLine(“字节读取:{0}”,TotalBytesRead+=BytesRead);
ChunkData=Crypt.Encrypt(ChunkData,KeyBytes,RM.IV);
//将字节数组写入文件
StreamOUT.Write(ChunkData,0,BytesRead);
}
}
}
这是我在解密之前处理文件的代码(不是解密本身)

使用(RijndaelManaged RM=new RijndaelManaged())
使用(FileStream StreamIN=newfilestream(FileIN,FileMode.Open,FileAccess.Read))
使用(FileStream StreamOUT=newfilestream(FileOUT,FileMode.Append,FileAccess.Write))
{
//设置变量ChunkSize和读取到流中的总字节数
int ChunkSize=1024*1024*32;
StreamIN.Seek(0,SeekOrigin.Begin);
int Read=流线读取(RM.IV,0,16);
StreamIN.Seek(RM.IV.Length,SeekOrigin.Begin);
int TotalBytesRead=0;
foreach(第四RM中的var项目)
{
控制台。写入(“[”+项+“]”);
}
//文件缓冲区实现
用于(长i=0;i0)
{
WriteLine(“字节读取:{0}”,TotalBytesRead+=BytesRead);
//本地类的调用解密
ChunkData=Crypt.Decrypt(ChunkData,KeyBytes,RM.IV);
//将字节数组写入文件
StreamOUT.Write(ChunkData,0,BytesRead);
}
}
}
我想就这些了?此外,“控制台”和其他无用的电话只是为了帮助我检查和解决问题。 我正在使用Visual Studio 2010,并尝试实现RijndaelManaged类

加密/解密方法通过文件块(字节数组)与我的密钥和IV一起传递,这些方法返回一个字节数组(加密),并保存到流中

我希望我的问题很清楚?如果不是的话,我会尽力解释得更好, 我到处都读过关于这个问题的帮助,但是这里发布的大多数其他问题都超出了我的范围

我真的很感激任何帮助,我肯定我在某个地方犯了个小丑的错误

谢谢

长期以来,似乎编写了
SymmetricAlgorithm.IV
以不返回内部数组。这意味着它将返回一个副本,因此对它的后续更改不会反映在
RijndaelManaged
实例中

// Effectively reading the persisted value into a temporary array
// and throwing away the temporary.
int Read = StreamIN.Read(RM.IV, 0, 16);
为了使更改保持不变并将IV设置为持久值,您需要明确地设置
IV
属性,而不仅仅是修改它之前返回的值

byte[] persistedIv = new byte[16];
StreamIN.Read(persistedIv, 0, persistedIv.Length);
RM.IV = persistedIv;

哇,想正确使用静脉注射的人。多么罕见的景象。我怀疑问题行是
intread=StreamIN.Read(RM.IV,0,16)
RM.IV
将返回一个字节数组,您将填充该数组,但为了设置IV,必须为该属性分配一个值。所以最好读入一个显式分配的数组,然后将
RM.IV
设置为等于该数组?提供更多细节:完全或部分不同,解密程序中有多少字节?什么是val
byte[] persistedIv = new byte[16];
StreamIN.Read(persistedIv, 0, persistedIv.Length);
RM.IV = persistedIv;