2010-04-04 20 views
2

Зависит ли производительность симметричного алгоритма шифрования от количества зашифрованных данных? Предположим, у меня около 1000 байтов, которые мне нужно быстро отправлять по сети, лучше ли шифровать 50 байтов данных 20 раз или 1000 байтов одновременно? Что будет быстрее? Это зависит от используемого алгоритма? Если да, то какой самый эффективный, самый безопасный алгоритм для данных объемом до 512 байт?Симметричное шифрование: вопросы производительности

ответ

5

Короткие ответы:

  • Вы хотите шифровать все данные на одном дыхании. Вы действительно хотите дать им все в одном вызове функции для кода шифрования, чтобы он мог работать еще быстрее.

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

  • Если у вас возникли сомнения, используйте протокол, составленный по протоколу SSL/TLS.Если задан выбор алгоритма шифрования в протоколе, используйте AES.

Теперь длинные ответы:

Есть блочные шифры и потоковый шифр. Шифр потока начинается с фазы инициализации, в которой ключ вводится в систему (часто называемый «расписание ключей»), а затем шифрует байты данных «на лету». С помощью шифрования потока зашифрованное сообщение имеет такую ​​же длину, что и входное сообщение, а время шифрования пропорционально длине входного сообщения, за исключением вычислительной стоимости ключевого расписания. Здесь мы не говорим больших чисел; ключевое время расписания составляет менее 1 микросекунды на не очень новом ПК. Тем не менее, для оптимальной производительности вы хотите сделать ключевое расписание один раз, а не 50 раз.

Блочные шифры также имеют ключевое расписание. Когда ключевое расписание выполнено, блочный шифр может шифровать блоки, т. Е. Фрагменты данных фиксированной длины. Длина блока зависит от алгоритма, но обычно это 8 или 16 байт. AES - это блок-шифр. Чтобы зашифровать «сообщение» произвольной длины, блочный шифр должен вызываться несколько раз, и это сложнее, чем кажется (есть много проблем с безопасностью). Часть, которая решает, как собираются эти вызовы, называется режимом цепочки . Известный цепной режим называется CBC. В зависимости от режима цепочки может потребоваться дополнительный шаг, называемый padding, в который добавлено несколько дополнительных байтов для входного сообщения, чтобы его длина стала совместимой с выбранной цепью. Заполнение должно быть таким, чтобы при расшифровке его можно было устранить однозначно. Общая схема дополнений называется «PKCS № 5».

Существует цепной режим, называемый «CTR», который эффективно превращает блок-шифр в потоковый шифр. У него есть хорошие моменты; в частности, режим CTR не требует заполнения, а длина зашифрованного сообщения будет иметь такую ​​же длину, что и входное сообщение. AES с режимом CTR хорош. Скорость шифрования будет составлять около 100 МБ/с на типичном ПК (например, Intel Core2 с тактовой частотой 2,4 ГГц, используя одно ядро).

Внимание: есть вопросы касаемо шифрования несколько сообщений с тем же ключом. С режимами цепочки эти проблемы скрываются под названием «IV» (как «начальное значение»). При большинстве режимов цепочки IV является случайным значением того же размера блока шифрования. IV не обязательно должен быть секретным (он часто передается вместе с зашифрованным сообщением, потому что дешифрующая сторона также должна его знать), но он должен выбираться случайным образом и равномерно, и каждому сообщению нужен новый IV. Некоторые режимы цепочки (например, CTR) могут допускать неравномерность IV, но только для первого сообщения, когда-либо имеющего данный ключ. С CBC даже первое сообщение нуждается в полностью случайном IV. Если этот абзац не имеет для вас полного смысла, то , пожалуйста,, не пытайтесь разработать протокол шифрования, он более сложный, чем вы себе представляете. Вместо этого используйте уже указанный протокол, например SSL (для туннеля шифрования) или CMS (для зашифрованных сообщений). Разработка таких протоколов была длительной и болезненной историей нападений и контрмер, с большим количеством измельчения зубов. Не обновляйте эту историю ...

Предупреждение 2: Если вы используете шифрование, то вы беспокоитесь о безопасности: могут возникнуть неблагоприятные сущности, склонные к атаке вашей системы. В большинстве случаев простое шифрование не полностью устраняет их; само по себе (правильно применяемое) шифрование поражает только пассивных злоумышленников, тех, кто наблюдает переданные байты, но не меняет их. Общий атакующий также активен, то есть он удаляет некоторые байты данных, перемещает и дублирует другие или добавляет дополнительные байты своего собственного проектирования.Чтобы победить активных злоумышленников, вам нужно больше, чем шифрование, вам также нужны проверки целостности. Там снова такие протоколы, как SSL и CMS, уже позаботились о деталях.

+0

Очень хорошее объяснение –

0

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

Что касается безопасности, все должно быть в порядке с Triple DES или AES.

1

Симметричные алгоритмы шифрования обычно являются блочными шифрами. Для любого заданного алгоритма размер блока фиксирован. Затем вы выбираете из нескольких разных способов создания последующих блоков, зависящих от более ранних блоков (т. Е. Цепочки блоков шифрования), для создания шифрования потока. Но шифр потока неизменно кэширует входящие данные и отправляет их блочному шифру в полные блоки.

Итак, делая 50 байт 20 раз, все, что вы делаете, стучит по вашей логике кэша.

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

+0

+1 для указания связи между размером партии данных и размером блока шифрования. – ojrac

3

AES должен быть хорошим выбором.

Хорошие реализации AES (например, входящие в библиотеку openssl) требуют около 10-20 циклов ЦП на байт для шифрования. Когда вы шифруете небольшие сообщения, вы также должны учитывать время установки ключа. Например, для типичной реализации DES требуется несколько тысяч циклов для настройки ключа. Например, вы можете закончить шифрование небольшого сообщения с помощью AES, прежде чем начать шифрование с другими шифрами.

Новые процессоры (например, процессоры на базе Westmere) имеют набор инструкций, который поддерживает AES, позволяя шифровать со скоростью 1,5-4 цикла на каждый байт. Любой другой шифр почти невозможно превзойти.

Если возможно, попробуйте шифровать более длинные сообщения, а затем разделите их на мелкие кусочки. Основная причина - не скорость шифрования, а безопасность. Например, для режима безопасного шифрования обычно требуется использовать вектор инициализации и аутентификацию сообщений (MAC). Они добавят около 32 байт к каждой части вашего зашифрованного текста. То есть если вы разделите свое сообщение на мелкие части, то эти накладные расходы будут значительными.

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