Поведение виртуального свойства в C#

У меня есть следующий код:

FileStream fs = new FileStream("test.crp",FileMode.Create);
Aes aes = Aes.Create();
FileStream fsKeys = new FileStream("keys.key",FileMode.Open);
fsKeys.Read(aes.IV,0,16);
fsKeys.Read(aes.Key,0,32);
fsKeys.Close();

И проблема в том, что: aes.IV и aes.Key не изменяются во время операции чтения из файла.

И я могу назначить им только новое значение, используя операторы присваивания:

 byte [] iv = new byte[16];
 byte [] key = new byte[32];
 aes.IV = iv;
 aes.Key = key;

Это правильное поведение? Если да, то в какой блок памяти я читаю, когда использую fs.Read?

1 ответ

Решение

Это потому Aes.IV а также Aes.Key возвращают "клонированный" массив байтов своих переменных-членов.

От fsKeys.Read(aes.IV,0,16);, вы модифицируете клонированный массив IV, а не переменную-член позади aes.IV,

Вы можете проверить исходный код здесь: https://referencesource.microsoft.com/#mscorlib/system/security/cryptography/symmetricalgorithm.cs,97c6f2476150a40d

Другие вопросы по тегам