2014-12-27 2 views
1

Я использую классы Rijndael из .net System.Security зашифровать мой RSA ключиЧто не так в моем Rijndael, что дает мне это?

это, как я поставил его:

static Rijndael CreateRijndael (byte[] userID, string password, string pepper) 
{ 
    if (userID == null) 
     throw new ArgumentNullException ("userID"); 
    if (password == null) 
     throw new ArgumentNullException ("password"); 
    if (pepper == null) 
     throw new ArgumentNullException ("pepper"); 
    string passpepper = password + pepper; 
    Rijndael Rij = Rijndael.Create(); 
    Rij.KeySize = 256; 
    Rij.Padding = PaddingMode.ISO10126; 
    Rij.Mode = CipherMode.CBC; 
    Rfc2898DeriveBytes aesKey = new Rfc2898DeriveBytes (passpepper, userID, 65536); 
    Rij.Key = aesKey.GetBytes (Rij.KeySize/8); 
    Rij.GenerateIV(); 
    return Rij; 
} 

и это то, что я получаю:

逫⇾귏䜪춈票칔alue><Modulus>kgOu5EG6vbabnvq6xB+cRmxDL.... 

Вместо

<RSAKeyValue><Modulus>kgOu5EG6vbabnvq6xB+cRmxDL... 

ли это IV?
Если это IV, он не должен смешивать весь текст, учитывая, что я установил режим CBC?

ответ

5

Как вы уже догадались, это проблема вектора инициализации.

При шифровании вы должны использовать случайный вектор инициализации и отправить его (или сохранить в своем случае) с помощью зашифрованного текста. При расшифровке вы должны использовать тот же вектор инициализации, который использовался для шифрования, не случайный.

В режиме CBC, поскольку вы используете здесь, неправильный вектор инициализации вызывает только первый блок (например, 16 байт для AES), который является мусором, остальная часть содержимого остается в порядке. Причина в том, что каждый блок после первого является XOR-ed с предыдущим зашифрованным текстом блока после дешифрования (и до шифрования), и это не зависит от IV.

С другими режимами работы вы можете получить полностью искаженный открытый текст.

Смежные вопросы