Ищущая альтернатива.NET CryptoStream?
Кто-нибудь знает искомую альтернативу.NET CryptoStream?
Это нормально, если альтернатива поддерживает поиск только в режиме "чтения" или если он ограничен, например, AES256.
3 ответа
Блочное шифрование абсолютно безопасно. Это просто ЕЦБ, это проблематично. Реализация может быть написана с использованием режима OFB или CTR. Однако мне так и не удалось найти его. Может стиснуть зубы и написать это...
ОБНОВИТЬ:
Так что я написал реализацию этого. По разным причинам я не собираюсь публиковать это здесь прямо сейчас (я постараюсь в какой-то момент), но вот несколько советов для тех, кто хочет сделать это:
Используйте преобразование RijndaelManaged в режиме CBC. Вы собираетесь вычислять блок шифрованного потока блоком. Вы можете сделать это путем инициализации ключа и пустого (все ноль) iv в преобразовании - фактическое iv будет вычисляться для каждого блока отдельно.
Вам понадобится метод, который вычисляет входные данные для текущего блока путем конкатенации или иного вычисления счетчика nonce плюс iv плюс. Здесь вы можете выполнить несколько оптимизаций, включая предварительные вычисления nonce & iv (этот метод будет вызываться много раз, так что, вероятно, оно того стоит).
например, byte [] GetCurrentCounterBlock (byte [] nonce, byte [] iv, UInt32 counter)
(примечание: под "iv" здесь я подразумеваю то, что NIST называет IV, среднюю часть целого блока, который другие люди называют IV вместе)
Вы собираетесь использовать этот метод в цикле, который шифрует ваши данные - вызывайте его в первый раз, а затем на границах блоков, чтобы обновить текущий поток шифров. Этот метод обеспечивает ввод в метод TransformBlock преобразования. Возьмите результат преобразования и присвойте результат XOR текущему блоку данных. Используйте transform.Reset() после того, как каждый блок зашифрован! В противном случае CBC попытается использовать выходные данные преобразования в качестве входных данных для следующего. Может быть более умный способ сделать это с.NET, но я не могу понять это. Я знаю, что BouncyCastle поддерживает OFB "изначально", так что это может быть лучшим вариантом, но это хороший быстрый способ получить многократно используемый криптопоток без внешних операций.
В любом случае, ключ в том, что весь этот метод (я называю его AesCtr256.Process - но вы могли бы легко быть более универсальным) работает с произвольным диапазоном данных внутри потока шифра. Вы можете легко использовать этот метод внутри пользовательского класса Stream. Это позволит искать произвольные местоположения внутри потока как при чтении, так и при записи, и даст вам данные с выравниванием байтов для работы (очень хорошо, поскольку теперь вы можете иметь криптопоток, который фактически сообщает истинную длину данных!).
Другими словами, вы вычисляете поток шифра для произвольных частей потока, а затем просто добавляете xor к шифру или простому тексту для шифрования / дешифрования.
Две последние вещи: 1.) Я настоятельно рекомендую повторно использовать преобразование для жизни потока - создание этого стоит дорого. 2.) Если вы собираетесь реализовать эту запись модульных тестов против векторов NIST или аналогичных. Не думайте, что вы поняли это правильно - то, что вывод выглядит случайным, не означает, что он правильно зашифрован:).
Если у кого-то есть мысли по поводу лучшего подхода или того, как я полностью испортил действительно важный кусок кода, пожалуйста, напишите, спасибо!
Я думаю, что такая реализация не будет очень полезной, так как Seek
Операции могут выполняться только (относительно, в зависимости от алгоритма) в постоянное время с цепочкой в стиле ECB, то есть для отдельного шифрования блоков - и это крайне не рекомендуется - см. изображение в этой статье в Википедии для поразительного примера небезопасности.
Мне кажется, вам было бы лучше, скопировав в / из MemoryStream
или подобная техника упаковки.
Это дублирующий вопрос. Я положил ответ в: Как добавить возможности поиска и позиционирования в CryptoStream
Даже он использует ECB, но вы можете использовать любой другой алгоритм. кстати, у него нет проблем с ЕЦБ, как отметил Барри Келли, потому что он использует ЕЦБ по-другому.