Почему set key ничего не делает в AES / SymmetricAlgorithm? - PullRequest
1 голос
/ 15 июня 2010

Это сильно меня утомило.Я думал, что устанавливаю ключ, но я не был.Никаких исключений, ничего не происходит, кроме плохих результатов.Почему есть сеттер, если все игнорируется и не выдается никаких исключений при попытке записи?Какой смысл сеттера в свойстве Keys?

Когда я это делаю, значение ключа ниже не изменяется.Через час, когда я понимаю, что происходит, я написал цикл для проверки.Я также попробовал aes.Key [0] = val;var b = val == aes.Key [0];(и запутался с ним в непосредственном режиме).

Почему у него такое поведение?

Array.Copy(myKey, aes.Key, aes.Key.Length);

int i = 0;
foreach (var v in aes.Key)
{
    var b = myKey[i++] == v;
    if (!b)
        b = b;
}

1 Ответ

2 голосов
/ 15 июня 2010

Ну, во-первых, вы не используете сеттер. То, что вы делаете, - это использование метода получения (который захватывает копию ключа) и установку отдельных байтов в копии массива ключей, возвращенного из метода получения (что не повлияет на внутреннее состояние AesCryptoServiceProvider).

Если вы хотите, чтобы установщик работал правильно, создайте новый массив byte и установите свойство:

byte[] newKey = new byte[aes.KeySize / 8];
// generate your key...
aes.Key = newKey;

Ответ на комментарий:

Ваш пример полностью в управляемом коде, и вы возвращаете прямую ссылку на байтовый массив DummyArray, поэтому, естественно, вы можете установить любой индекс, который вы выберете, потому что вы решили вернуть ссылку. Однако не существует требования, согласно которому вы должны возвращать ссылку на байтовый массив (это подробности реализации).

Управляемые CSP просто упаковывают вызовы в неуправляемый CAPI , поэтому, когда данные распределяются, все, что вы получаете, - это копия фактических данных.

...