2017-11-14 4 views
1

ich nächsten Code habe:Das Verhalten von virtuellem Eigentum in 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(); 

Und das Problem ist, dass: aes.IV und aes.Key nicht während des Lesevorganges aus der Datei geändert werden.

Und ich kann nur einen neuen Wert, um sie mit den Zuweisungsoperator zuweisen:

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

Ist es ein richtiges Verhalten? Wenn ja, dann zu welchem ​​Speicherblock lese ich, wenn ich fs.Lesen?

Antwort

1

Das ist, weil Aes.IV und Aes.Key "geklonten" Bytearray seiner Mitgliedsvariablen zurückgeben.

Durch fsKeys.Read(aes.IV,0,16); ändern Sie das geklonte IV-Array, nicht die Mitgliedsvariable hinter aes.IV.

können Sie den Quellcode hier überprüfen: https://referencesource.microsoft.com/#mscorlib/system/security/cryptography/symmetricalgorithm.cs,97c6f2476150a40d

+0

Danke! Aber warum klonen sie es? –

+0

Wenn Sie etwas wie 'aes.IV [0] = 100; 'tun könnten, wäre die Aes-Klasse nicht in der Lage, die Änderung zu verarbeiten. Im Allgemeinen werden Eigenschaften, die Arrays zurückgeben, nicht als eine gute Vorgehensweise betrachtet. Sie können viele Artikel finden, die darüber sprechen, wie [dieser] (https://blogs.msdn.microsoft.com/ericlippert/2008/09/22/arrays-consided-somewhat-harmful/) –

Verwandte Themen