Поведение виртуального свойства в 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