Пример MSDN: это ошибка или оптимизация (класс X509Certificate2) - PullRequest
0 голосов
/ 22 февраля 2012

Я смотрел на хороший пример на этой странице MSDN: http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.aspx

Прокрутите до половины пути к примеру и посмотрите на метод:

// Decrypt a file using a private key.
private static void DecryptFile(string inFile, RSACryptoServiceProvider rsaPrivateKey)

Вы заметитечитатель читает только 3 байта за раз, когда он пытается прочитать int из потока:

inFs.Seek(0, SeekOrigin.Begin);
inFs.Read(LenK, 0, 3);// <---- this should be 4
inFs.Seek(4, SeekOrigin.Begin);// <--- this line masks the bug for smaller ints
inFs.Read(LenIV, 0, 3); // <---- this should be 4

Поскольку следующая строка ищет позицию "4", ошибка маскируется.Правильно ли я понимаю или это намеренно, то есть какая-то странная оптимизация, поскольку мы знаем, что (для этого примера) длина ключа AES и IV будет достаточно мала, чтобы вместить ее в 3 байта, поэтому прочитайте только 3, а затем пропуститедо 4, таким образом сохранить чтение 1 байт с диска?

Если оптимизация .... Действительно ??

1 Ответ

1 голос
/ 22 февраля 2012

Я очень сомневаюсь, что это оптимизация.Чтение с диска, как правило, происходит частями, существенно превышающими четыре байта, и кэширование в значительной степени аннулирует этот тип оптимизации, за исключением очень редкого случая, когда четыре байта могут пересекать два разных «сектора» диска (или любое другое разрешение чтения диска).).

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

Не говорю, что это так, но вы можете захотетьвзглянуть на историю некоторых крупных компаний по использованию полей в своих целях, несмотря на то, что в стандартах говорится, «обнимай, расширяй, гаси»: -)

...