Мы пытаемся интегрироваться с устаревшим приложением С#, которое использует RijndaelManaged для симметричного шифрования. Однако оказалось, что они использовали 13-байтовую строку в качестве ключа шифрования!
Код в основном:
var initVectorBytes = Encoding.ASCII.GetBytes("16-char string");
var keyBytes = Encoding.ASCII.GetBytes("13-char string");
var symmetricKey = new RijndaelManaged { Mode = CipherMode.CBC };
var decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes);
var memoryStream = new System.IO.MemoryStream(encryptedbytes);
var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);
....
Теоретически это не должно работать - документы четко сказать: «Размер ключа должен быть 128, 192 или 256 бит», и когда мы попробуем это (на компиляторе Xamarin/Mono - в данный момент у нас нет легкого доступа к .net), он выдает исключение.
Но это, по-видимому, работает в устаревшей системе, и у них есть модульные тесты, которые также вызывают CreateDecryptor с 13-байтовым ключом; так что, по-видимому, реальная система .net как-то что-то делает с этим кодом. (Обратите внимание, что в документах для .net версии 2.0 не говорится об ограничениях длины ключа — однако код скомпилирован с использованием .net 3.5)
Возможно ли, что он использует алгоритм Rijndael со 104-байтовым ключом и размером блока? Или это как-то дополнит ключ или что-то в этом роде?
private void GenerateKeyExpansion(byte[] rgbKey)
. Когда он больше 16, а не в (24, 32), он выкинет, насколько я понимаю, декомпилированную сборку .NET 2.0. Также не имеет значения, как вы его скомпилируете, реализация находится в CLR. Так что это правда, что вы видите разное поведение в разных средах выполнения. - person CodeCaster   schedule 15.01.2015