Rijindael从文件中写入和读取回键
本文关键字:读取 文件 Rijindael | 更新日期: 2023-09-27 18:17:24
我使用的是c# . net 4.0。我使用rijindael类生成密钥和IV(初始化向量)。然后将它们都写入一个文件。当我读取文件时,IV总是正确的,但是键的最后一个字节总是零。我在写入文件之前查看键,它很好,在最后一个字节中读取它总是零。
我试过设置填充模式的各种选择,他们没有区别。
using (Rijndael myRijndael = Rijndael.Create())
{
//Create keys
try
{
byte[] key;
byte[] iv;
key = new byte[32];
iv = new byte[16];
theKeys.Key = myRijndael.Key;
theKeys.IV = myRijndael.IV;
FileStream fs = File.Create("yyy.txt");
fs.Write(theKeys.Key, 0, theKeys.Key.Length);
fs.Flush();
fs.Close();
FileStream ts = File.Open("yyy.txt", FileMode.Append);
ts.Write(theKeys.IV, 0, theKeys.IV.Length);
ts.Flush();
ts.Close();
FileStream ms = File.Open("yyy.txt", FileMode.Open);
ms.Read(key, 0, 31);
ms.Seek(32, 0);
ms.Read(iv, 0, 16);
ms.Flush();
ms.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
// Save key and IV
using (var rijndael = new RijndaelManaged())
using (var writer = new BinaryWriter(File.Create("yyy.dat")))
{
writer.Write(rijndael.Key, 0, 32);
writer.Write(rijndael.IV, 0, 16);
}
// Restore key and IV
using (var rijndael = new RijndaelManaged())
using (var reader = new BinaryReader(File.OpenRead("yyy.dat")))
{
rijndael.Key = reader.ReadBytes(32);
rijndael.IV = reader.ReadBytes(16);
}
问题是您只要求读取31个字节:
ms.Read(key, 0, 31);
应该改成:
ms.Read(key, 0, 32);
同样,这样可以更高效(在本例中不使用key,只使用本地变量):
using (Rijndael myRijndael = Rijndael.Create())
{
//Create keys
try
{
byte[] key;
byte[] iv;
key = new byte[32];
iv = new byte[16];
key = myRijndael.Key;
iv = myRijndael.IV;
using (FileStream fs = File.Create("yyy.txt"))
{
fs.Write(key, 0, key.Length);
fs.Write(iv, 0, iv.Length);
}
using (FileStream ms = File.Open("yyy.txt", FileMode.Open))
{
key = new byte[32];
iv = new byte[16];
ms.Read(key, 0, 32);
ms.Read(iv, 0, 16);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}