2016-11-25 8 views
1

Я заметил следующее странное поведение в следующем коде, если я установил ключ в инициализатор объекта, он генерирует случайный ключ и не устанавливает мой ключ. Это глюк?Странное поведение во время RijndaelУстановленная конструкция

var algorithm = new RijndaelManaged 
{ 
    Mode = CipherMode.CBC, 
    Key = keyBytes,  //if i set the keyBytes here 
    KeySize = _keySize, 
    IV = Encoding.ASCII.GetBytes(_initVector), 
    BlockSize = 128, 
    Padding = PaddingMode.Zeros 
}; // Set encryption mode to Cipher Block Chaining 

bool wtf= algorithm.Key.AreEqual(keyBytes); 

if (!wtf) // <!-- the Key is not the same here 
{ 
    algorithm.Key = keyBytes; // so i end up having to set it again here so that i can decrypt properly 
} 

ответ

1

Его не ошибка. Посмотрите исходный код

Это свойство Key.

public virtual byte[] Key { 
     get { 
      if (KeyValue == null) GenerateKey(); 
      return (byte[]) KeyValue.Clone(); 
     } 
     set { 
      if (value == null) throw new ArgumentNullException("value"); 
      Contract.EndContractBlock(); 
      if (!ValidKeySize(value.Length * 8)) 
       throw new CryptographicException(Environment.GetResourceString("Cryptography_InvalidKeySize")); 

      // must convert bytes to bits 
      KeyValue = (byte[]) value.Clone(); // your byte[] will be set 
      KeySizeValue = value.Length * 8; // key size will be set too 
     } 
    } 

Это свойство KeySize.

public virtual int KeySize { 
    get { return KeySizeValue; } 
    set { 
     if (!ValidKeySize(value)) 
      throw new CryptographicException(Environment.GetResourceString("Cryptography_InvalidKeySize")); 

     KeySizeValue = value; 
     KeyValue = null; // here keyvalue becomes null 
    } 
} 

Это потому, что вы установили KeySize после установки KeyValue поэтому проблему вы получите.

Я думаю, вы не должны устанавливать KeySize, потому что он будет установлен автоматически, как вы можете видеть в исходном коде. если вы установили KeySize, ваш Key станет пустым по реализации по какой-либо причине.

var algorithm = new RijndaelManaged 
     { 
      Mode = CipherMode.CBC, 
      Key = keyBytes, 
      // KeySize = _keySize, // remove this 
      IV = Encoding.ASCII.GetBytes(_initVector), 
      BlockSize = 128, 
      Padding = PaddingMode.Zeros 
     }; 
+0

Я думаю, по определению это не ошибка ... но я все еще чувствую, что это странная реализация. не задумываясь, вы никогда не ожидали, что это произойдет. это противоречит правилам инициализации объекта. плюс он просто чувствует себя грязным, чтобы одно свойство тайно аннулировало другое. – drowhunter

+0

Поскольку эти свойства являются 'public virtual', вы можете создать свой собственный класс, наследовать от' RijndaelManaged' и переопределить 'Key' и' KeySize'. Но сначала я должен искать причину, по которой это реализовано. возможно, имея разные «KeySizeValue» из «KeyValue», вводит некоторые другие ошибки или даже ошибки времени выполнения и т. д. @drowhunter –

+1

да имеет смысл, но он задает вопрос .. если если в массиве ключей и ключах нужно сопоставить, почему бы даже позволить им быть установить по-другому? кажется мне плохой логикой. – drowhunter