Системы защиты программ на основе традиционных электронных ключей редко можно создать таким образом, чтобы передаваемые данные между электронным ключом и защищенным приложением всегда были разные при одних и тех же обстоятельствах. Этим широко пользуются хакеры, прослушивая трафик, запоминая его и создавая эмуляторы, которые вместо реального ключа подставляют эти данные.
По идее с этим несложно бороться, если в электронном ключе есть ассиметричные алгоритмы — данные можно шифровать на сеансовом ключе (он каждый раз разный). Еще один способ, казалось бы такой же хороший, но на мой взгляд спорный, — перенести кусок защищенной программы в электронный ключ (заказные электронные ключи или Guardant Code).
Оба способа характеризуются тем, что в трафик попадают случайные числа, которые либо специально созданы защищенной программой (генератором случайных чисел), либо основываются на тех данных, которые пользователь вводит при использовании программы, либо, что еще лучше, содержат и то и другое вместе.
Если в ключ помещается какой-то алгоритм защищенной программы, то скорее всего, так называемая, энтропия его параметров слишком плохая. Т. е. случайных данных слишком мало, чтобы служить единственной опорой для защиты. Поэтому в любом случае передаваемые между приложением и ключом данные лучше всего шифровать, причем на ключе шифрования, который каждый раз разный. Такие типы ключей называют сеансовыми.
По сути существует всего 2 наиболее распространенных алгоритма выработки сеансовых ключей для шифрования трафика: протокол обмена ключами Диффи-Хеллмана и MQV.
Первый без аутентификации, второй с взаимной аутентификацией. Казалось бы, нет проблем: бери и используй! Но что выясняется при детальном анализе: алгоритм Диффи-Хэлмана вообще не защищает от атаки типа «man-in-the-middle» или, проще говоря, от создания табличного эмулятора (с чем собственно и боремся). А алгоритм MQV защищает до тех пор, пока кто-то из хакеров не отыщет одну из его констант в защищенном приложении (а точнее в API электронного ключа). И тогда также запросто можно создавать табличные эмуляторы.
Интересно, что есть электронные ключи, которые используют подобные алгоритмы (например, ECKAS-DH1 — модификация DH для эллиптических кривых) и позиционируют себя как более защищенные! А в реальности они только пускают пыль в глаза и ничего кроме насмешки у профессионального взломщика вызвать не могут.
По этой причине при создании электронных ключей Guardant Sign, Guardant Time и Guardant Code нам пришлось использовать иные алгоритмы выработки сеансовых ключей, адаптированные применительно к задаче защиты программного обеспечения, с учетом тех современных видов атак, которые может реализовать хакер.
Вывод напрашивается такой: используя криптографию в защите программ, необходимо детально анализировать те тонкости, которые существуют в этой области, т. к. помимо классических, существуют еще свои — особенные.