Что делает шифрование RijndaelManaged с недопустимыми размерами ключа

Мы пытаемся интегрироваться с устаревшим приложением С#, которое использует 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-байтовым ключом и размером блока? Или это как-то дополнит ключ или что-то в этом роде?


person Korny    schedule 15.01.2015    source источник
comment
1) Он делает что-то недокументированное, глючное и бессмысленное. 2) Если возможно, расшифруйте все данные, а затем замените функцию шифрования как в старой, так и в новой системе чем-то стандартным и безопасным.   -  person CodesInChaos    schedule 15.01.2015
comment
Или он каким-то образом дополняет ключ или что-то в этом роде? - ключ растягивается, если ключ меньше 16 байт, см. private void GenerateKeyExpansion(byte[] rgbKey). Когда он больше 16, а не в (24, 32), он выкинет, насколько я понимаю, декомпилированную сборку .NET 2.0. Также не имеет значения, как вы его скомпилируете, реализация находится в CLR. Так что это правда, что вы видите разное поведение в разных средах выполнения.   -  person CodeCaster    schedule 15.01.2015
comment
скомпилированный был действительно неправильным термином :) Спасибо за указатель на GenerateKeyExpansion - я также нашел stackoverflow.com/questions/15260399/, который кажется похожим.   -  person Korny    schedule 15.01.2015