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);
    }
}

Rijindael从文件中写入和读取回键

// 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);
            }
        }