На сегодняшний день электронные ключи — это, пожалуй, наиболее надежное средство защиты программ от нелицензионного использования. Базовым элементом этих интеллектуальных устройств, как правило, служит процессор, способный выполнять преобразование данных по сложным алгоритмам.
Кроме того, большинство ключей позволяет разработчикам хранить в их памяти какие-либо данные, используемые в системе защиты.
Объем этой памяти относительно невелик — обычно несколько сотен байт, но достаточен для целей защиты. Наиболее распространенным интерфейсом для электронных ключей пока остается LPT, однако в последнее время получили распространение ключи для шины USB.
Разработчики электронных ключей предоставляют два основных метода защиты ПО: автоматическую защиту и защиту на основе интерфейсов API. Автозащита позволяет «запечатывать в конверт» готовые исполняемые файлы. А с помощью API можно встраивать обращения к ключу непосредственно в приложение на уровне исходных кодов.
Преимущество второго способа состоит в том, что API позволяет разрабатывать защиту любой степени сложности на основе запросов к ключу. Для наибольшей защищенности программы рекомендуется комбинировать оба метода.
Российская компания «Актив» выпускает электронные ключи для защиты программ под торговой маркой Guardant уже 10 лет. Наиболее популярной моделью считается Guardant Stealth, которая претерпела за последние годы многочисленные изменения в элементной базе и конструкции, но сохранила в целом исходную функциональность.
Однако время диктует свои условия, и в сентябре 2004 г. компания «Актив» представила программистскому сообществу электронный ключ нового поколения — Guardant Stealth II и его сетевую версию — Guardant Net II. Данные устройства реализованы на современной элементной базе, используют новые алгоритмы, обеспечивая при этом полную обратную функциональную совместимость со старыми версиями.
Главная инновация продукта — алгоритм кодирования данных, названный GSII64. В отличие от однонаправленного алгоритма, реализованного в ключах Guardant Stealth, GSII64 — алгоритм симметричный. Это означает, что с его помощью можно проводить как прямое преобразование данных (кодирование), так и обратное (декодирование).
Эти операции выполняются на основе одного или нескольких секретных ключей, которые программист может записывать в память Guardant Stealth II самостоятельно — при помощи утилиты, входящей в комплект разработчика.
Алгоритм GSII64 работает с определителями (ключами) длиной 16 или 32 байт (128 или 256 бит) и может выполнять следующие функции:
- блочное преобразование данных (размер блока — 8 байт);
- поточное преобразование данных произвольной длины;
- генерацию псевдослучайных чисел;
- вычисление Message Authentication Code (MAC).
Режимы работы алгоритма GSII64
Алгоритм GSII64 поддерживает классические режимы работы блочных симметричных алгоритмов, описанные ниже.
ЕСВ — режим электронной кодовой книги
Это простейший вариант алгоритма GSII64. В этом случае каждый исходный 8-байтовый блок преобразуется с одним и тем же определителем в другой 8-байтовый блок, поэтому обработка двух одинаковых блоков даст идентичный результат. ЕСВ подходит для кодирования небольших объемов данных, например, векторов инициализации, используемых в других режимах алгоритма, или ключей шифрования для других алгоритмов.
СВС — режим сцепления кодированных блоков
В СВС, как и в ЕСВ, каждый 8-байтовый блок преобразуется в 8-байтовый блок, и используется один и тот же определитель. Однако, в отличие от ЕСВ, преобразование двух одинаковых 8-байтовых блоков, находящихся в разных позициях исходного блока данных, не даст идентичного результата, так как на каждом следующем шаге кодируется не сам блок, а его сумма по модулю 2 с предыдущим закодированным блоком.
Преобразование получается позиционно-зависимым, поскольку результат кодирования зависит не только от самого блока, но и от предшествующего ему. Режим СВС можно использовать для вычисления надежных контрольных сумм, аутентификации и проверки подлинности данных.
В качестве контрольной суммы используется последний закодированный 8-байтовый блок, который зависит от всех предыдущих закодированных блоков, а также от вектора инициализации, и вычисляется на основе определителя алгоритма.
CFB — режим с кодированной обратной связью
Он позволяет преобразовывать блоки данных произвольного размера, не обязательно кратного 8 байтам. Это избавляет от необходимости дополнять исходные данные до целого числа 8-байтовых блоков. В этом режиме длина закодированной последовательности будет равна длине исходной. В CFB, как и в СВС, происходит сцепление блоков исходных данных, поэтому каждый закодированный блок будет зависеть от всех предыдущих блоков.
OFB — режим с обратной связью по выходу
Он имеет много общего с CFB, главное отличие состоит в том, что для кодирования следующего блока используется не закодированный предыдущий блок, а результат преобразования вектора инициализации IV (Initialization Vector). Преимущество данного режима в том, что при передаче закодированных данных снижается зависимость от искажений предыдущих блоков. Иначе говоря, в случае повреждения одного блока остальные блоки при декодировании не пострадают.
У этого преимущества есть и обратная сторона — OFB обеспечивает меньшую защиту от преднамеренного изменения данных, поскольку при изменении одного бита закодированных данных в раскодированной информации будет изменен тот же разряд. Для проверки подлинности данных в таком случае нужно пользоваться надежной контрольной суммой.
Конструкция USB-ключей также претерпела радикальные изменения. Теперь ключ представляет собой цельнолитой корпус из высокопрочного пластика, в котором печатная плата надежно фиксируется заказным усиленным разъемом USB, обладающим повышенным ресурсом подключений. Устройство может выдерживать значительные механические нагрузки.