СПОСОБ ОБЕСПЕЧЕНИЯ ЦЕЛОСТНОСТИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
METHOD OF PROVIDING SOFTWARE INTEGRITY

Область техники, к которой относится изобретение
Настоящее изобретение относится к области защиты программного обеспечения и, более конкретно, к устройству и средствам защиты программного обеспечения от несанкционированного использования, обеспечивающим, тем самым, целостность того или иного компонента программного обеспечения.
Уровень техники
В области защищенной обработки данных необходимо обеспечить наличие среды с защитой от несанкционированного вмешательства, в которой может осуществляться защищенная обработка. Первые попытки решить проблему безопасности приложений концентрировались на создании таких аппаратных средств, которые позволяли бы обеспечить как можно более высокую степень защиты содержащегося в них программного обеспечения. Понятие защиты от несанкционированного вмешательства означало в то время, что такие аппаратные средства было трудно вскрыть, или что после вскрытия они должны были вывести из строя микросхему, в которой постоянно хранилось защищенное программное обеспечение. Однако в настоящее время общепризнано, что программные методы, используемые для достижения безопасности приложений, обеспечивают большую степень гибкости и позволяют снизить затраты, и действительно, в большинстве случаев, когда хорошая защищенность приложения гарантирует, что данный компонент программного обеспечения не подвергался несанкционированному вмешательству, применяется сочетание программного и аппаратного подходов.
Типовая система, в которой выполняется приложение, обычно содержит процессорный блок, набор внешних периферийных устройств и память. В большинстве случаев, когда требуется защищенность, применяются схемы шифрования. В таких схемах информация, которую необходимо сохранять защищенной, т.е. рабочие данные или исполняемый код, подвергается шифрованию. Шифрование обычно выполняется в модуле безопасности, который образует часть системы. Модуль безопасности может быть реализован разнообразными способами, например на микропроцессорной плате, на платежной карточке со встроенным микропроцессором или в любом электронном модуле в виде идентификационного жетона или ключа. Такие модули, как правило, являются переносными устройствами, отсоединяемыми от приемника, а их конструкция предусматривает защиту от несанкционированного вмешательства. Наиболее распространенный тип модуля имеет электрические контакты, однако применяют и бесконтактные версии типа ISO 14443. Существует также другой вариант реализации модуля безопасности, при котором он непосредственно впаян внутри приемника, а разновидностью такого варианта является ИС, подключаемая к гнезду или разъему, такая как модуль SIM. Еще одним вариантом осуществления является модуль безопасности, встроенный в микросхему, которая выполняет другую функцию, например в модуль дескремблирования или микропроцессорный модуль декодера. Модуль безопасности может также быть реализован с помощью программного обеспечения.
Несмотря на использование модулей безопасности и развитых методов шифрования в современных системах защищенной обработки, такие системы по-прежнему сохраняют значительную привлекательность в отношении попыток нарушения их защиты. Методы, применяемые в целях нарушения защиты таких систем, включают, например, инженерный анализ используемых аппаратных средств или динамический или статический анализ содержащегося в них программного обеспечения и последующего нарушения целостности такого программного обеспечения. Под статическим анализом подразумевается какая-то форма дисассемблирования или декомпиляции неисполняющегося кода. Под динамическим анализом подразумевается проведение анализа во время исполнения кода, например, путем наблюдения за определенными сигналами при выполнении программы. Такие виды анализа могут привести к несанкционированному вмешательству, посредством которого модифицируется программное обеспечение, например, при помощи атаки с «заклиниванием» ветвления, при котором вместо условного перехода вводится безусловный, приводя тем самым к исполнению определенной ветви, когда такое исполнение не предписывается текущими условиями. Как правило, такая атака заставляет программу обходить шаг аутентификации, например, такой как проверка серийного номера или пароля.
В работе под названием «Устойчивость к несанкционированному вмешательству», представленной в 2005 г. в качестве диссертации на соискание ученой степени магистра наук, Ping Wang описывает метод многоблочного шифрования, при котором программа разделяется на некоторое количество независимых блоков в соответствии с последовательностью выполнения программы. После этого каждый блок программы шифруется, при этом всем блокам присваиваются разные ключи шифрования. Ключ шифрования для каждого блока представляет собой хеш-значение предыдущего блока в соответствии с последовательностью выполнения программы. Этот метод подходит для программ, имеющих древовидную структуру, в которых блоки расположены иерархически так, что один блок ведет к другому. В этом методе первый исполняемый блок должен быть незашифрованным. Код, вызывающий программу дешифрования, помещается внутри каждого из блоков, а программный контроллер для реализации динамической проверки целостности добавляется к концу программы. Если злоумышленник попытается изменить часть программы, хеш-значение для блока, содержащего измененную часть программы, будет другим, поэтому следующий блок не будет правильно дешифрован, и произойдет сбой программы.
Эта схема имеет недостаток, состоящий в том, что каждый блок необходимо прочитать дважды. Другой недостаток заключается в том, что шифрование выполняется поблочно, а не покомандно, при этом один ключ дешифрования является действительным для всего блока. Это означает, что раскрытие одного ключа оставляет уязвимым весь блок программного обеспечения. Размер наименьшего возможного блока определяется наименьшим блоком, полностью содержащим какой-либо цикл, поскольку в данной схеме блок по определению должен содержать полный цикл. Даже если бы программу можно было сократить до одной команды на блок в случае отсутствия циклов, итоговые непроизводительные затраты ресурсов при реализации данного способа сделали бы окончательный результат малоудовлетворительным с точки зрения размера и скорости исполнения. Кроме того, можно представить себе вероятную атаку, при которой какой-либо блок может подвергнуться модификации, при этом в программный контроллер будет внесено соответствующее изменение, компенсирующее эту модификацию таким образом, чтобы он вычислял правильное хеш-значение по отношению к произведенной модификации блока, тем самым сохраняя кажущуюся целостность программы.
Раскрытие изобретения
Настоящее изобретение позволяет исполняемому коду находиться в зашифрованном формате, при этом шифрование выполняется покомандно и не требует повторного считывания команд. Данная схема может быть полностью реализована с помощью аппаратных средств, при этом ее неотъемлемым преимуществом является то, что ключи шифрования никогда не появляются в каком-либо месте, где они могут оказаться уязвимыми для перехвата.
Непроизводительные затраты ресурсов программы отсутствуют, поэтому скорость исполнения значительно возрастает. В предшествующем уровне техники ключ шифрования для следующего блока зависел только от содержания предыдущего блока. В настоящем изобретении ключ шифрования может зависеть от накопления некоторого количества значений предыдущих ключей шифрования. Например, ключ для дешифрования следующей команды может быть основан на текущей команде в сочетании с накоплением ключей для двух предыдущих команд.
Целью настоящего изобретения является решение проблемы безопасности, вызываемой анализом программного обеспечения и последующим злонамеренным использованием указанного программного обеспечения, при одновременной минимизации непроизводительных затрат ресурсов в целях достижения решения и обеспечения его гибкости и применимости к системам, в которых используется программное обеспечение, имеющее многие различные типы структур. Это достигается при помощи способа обеспечения целостности программного обеспечения в памяти для хранения программ, реализуемого посредством процессора, причем программное обеспечение содержит набор зашифрованных команд, включающих по меньшей мере код операции, а способ предусматривает использование инициализированного ключа команды и включает следующие шаги:
считывают текущую зашифрованную команду; используют указанный ключ команды для дешифрования текущей зашифрованной команды; обновляют ключ команды при помощи вычисления, основанного на дайджесте текущего значения ключа команды и дайджесте текущей команды так, чтобы следующую считываемую зашифрованную команду можно было дешифровать при помощи обновленного ключа команды; и исполняют текущую команду.
Настоящее изобретение может применяться к программам, структура которых необязательно является древовидной по своему характеру, и может быть реализовано программными средствами или только аппаратными средствами, исключая с их помощью возможность перехвата дешифрованной команды или ключа дешифрования третьей стороной.
Краткое описание чертежей
Настоящее изобретение легче всего будет понять из следующего подробного описания предпочтительных вариантов вместе с прилагаемыми чертежами.
На ФИГ.1 представлена упрощенная структурная схема одного из вариантов осуществления настоящего изобретения.
На ФИГ.2 показана блок-схема одного из вариантов осуществления настоящего изобретения.
На ФИГ.3 представлена упрощенная структурная схема, показывающая, как можно управлять переходами или ветвлениями программы согласно одному из вариантов осуществления настоящего изобретения.
Осуществление изобретения
Как уже отмечалось, целью настоящего изобретения является предложение средств защищенного выполнения программ, когда программное обеспечение хранится в памяти в зашифрованном виде, а дешифруется и исполняется защищенным процессором покомандно при отсутствии возможности текущего контроля над ним. Ключ для дешифрования текущей команды зависит от правильного декодирования по меньшей мере одной предыдущей команды, при этом ключ для дешифрования следующей команды зависит от правильного дешифрования текущей команды. При этом обеспечивается наличие средств самопроверки, гарантирующих целостность данного компонента программного обеспечения. Само успешное исполнение программы служит гарантией того, что не была нарушена целостность ни потока, ни контента, поскольку модификация одной команды сделала бы невозможной дешифрование следующей команды, приведя тем самым к преждевременному завершению выполнения программы или по меньшей мере к нарушению трассировки выполнения программы. Схема, используемая в настоящем изобретении, может быть реализована программными средствами, однако следует отметить, что ее можно полностью реализовать аппаратными средствами, тем самым устраняя возможность перехвата незашифрованных команд или любого из используемых ключей дешифрования третьей стороной. Изобретение приводит к почти полному отсутствию непроизводительных затрат ресурсов по сравнению с решениями предшествующего уровня техники. Данную схему можно применять к программному обеспечению различной архитектуры или структуры, включая программы, использующие переходы и прерывания, и не ограничивается структурами, известными под названием древовидных.
Таким образом, в настоящем изобретении предлагается способ обеспечения выполнения программ с защитой от несанкционированного вмешательства в системе, включающей по меньшей мере память программ (РМЕМ) для хранения зашифрованных команд программы (INSTP', INSTC', INSTF'), модуль дешифрования (DECR) для дешифрования указанных команд программы, блок обработки данных (SCPU) для исполнения дешифрованных команд программы (INSTP, INSTC, INSTF) и средство создания ключей дешифрования, известных под названием «ключи команд» (КР, КС, KF) для дешифрования зашифрованных команд программы. Средство создания ключей команд могло бы, конечно, постоянно храниться в блоке обработки данных. Модуль дешифрования и блок обработки данных предпочтительно должны постоянно находиться в модуле безопасности любого типа, которые хорошо известны из предшествующего уровня техники.
При исполнении зашифрованной программы текущая зашифрованная команда (INSTC') считывается из памяти программы (РМЕМ) и дешифруется (DECR) с целью выдачи текущей команды (INSTC) при помощи текущего ключа дешифрования (КС), который создается на основе комбинации (Fn) дайджеста предыдущего ключа дешифрования (КР), с одной стороны, и дайджеста предыдущей выполненной команды (DIG(INSTRP)), с другой стороны, как показано на ФИГ. 1. Под «дайджестом» подразумевают любую операцию, применяемую ко всему операнду или его части и выдающую выходной результат. Следует отметить, что дайджест, выполняемый над операндом, может выдавать выходной результат, равный самому операнду. Согласно одному варианту осуществления настоящего изобретения дайджест включает одностороннюю функцию, выполняемую над операндом. Это позволяет дополнительно препятствовать любой попытке третьей стороны восстановить и получить предыдущие ключи или предыдущие команды. Примером такой односторонней функции является хеш-функция (например, SHA2, MD5). Под «комбинацией» подразумевается любой вид комбинации упомянутых операндов, например логический, арифметический или криптографический. Следовательно, гарантируется защищенность потока и контента, поскольку, если текущая зашифрованная команда не является командой, которая была предусмотрена разработчиком программы, текущий ключ дешифрования (КС), используемый для дешифрования текущей зашифрованной команды, выдаст другое, непредусмотренное значение. Таким образом, мы получаем компонент программного обеспечения, который осуществляет самопроверку, поскольку целостность программы гарантируется просто ее успешным исполнением. Если данная программа подверглась несанкционированному вмешательству, ее исполнение станет невозможным.
На ФИГ.2 показана блок-схема, представляющая один из вариантов осуществления настоящего изобретения. В данном представлении изобретение описано с точки зрения моментального снимка, а не обсуждения текущей команды с ее текущим ключом дешифрования и предыдущей команды с предыдущим ключом и т.д., при этом речь идет только о каком-то ключе команды (К1), который обновляется при исполнении каждой команды. Как обычно делается в любом блоке обработки, счетчик программы (PC) используется для указания адреса ячейки следующей исполняемой команды. Значение счетчика программы увеличивается на единицу после исполнения любой команды либо обновляется иным образом, если указанная команда предписывают другую форму обновления, отличную от простого увеличения на единицу. Например, если команда включает операцию загрузки значения из регистра, то значение счетчика программы обычно просто увеличивается на единицу, чтобы указать следующую ячейку. Однако если команда включает переход к определенной ячейке, счетчик программы будет обновляться посредством записи в него значения адреса ячейки, указываемого операцией перехода.
Сначала выполняется инициализация (INI PC, INI KI) счетчика программы (PC) и ключа команды (KI). Зашифрованная команда считывается из памяти программы по адресу, указанному счетчиком программы (RD INST c.f. PC), и дешифруется при помощи ключа команды (DCPT INST, KI). Команда исполняется (ЕХ INST) и счетчик программы обновляется (UPD PC) либо простым увеличением на единицу, либо путем подстановки нового значения, как предписывается командой. Ключ команды обновляется (UPD KI, INST) при помощи дайджеста исполняемой команды. Таким образом, при обновлении ключа команды учитывается не только команда, которая только что была исполнена, но и значение ключа, которое использовалось для дешифрования этой команды. В свою очередь, ключ команды, который до этого использовался для дешифрования предыдущей команды, был создан на основе предыдущей команды и ключа команды, который использовался для дешифрования команды перед этим. Вследствие этого значение ключа команды зависит не только от последней исполненной команды, но и от всех выполненных до этого команд в совокупности. Фактически, в одном из вариантов осуществления настоящего изобретения, при обновлении ключа команды учитывается значение последней исполненной команды и значения по меньшей мере двух предшествующих исполненных команд. Например, ключ для дешифрования команды 4 мог бы представлять собой комбинацию дайджеста команды 3, дайджеста команды 2 и дайджеста команды 1.
Как показано на ФИГ. 2, способ согласно настоящему изобретению включает цикл, в котором ключ команды обновляется при помощи предшествующей выполненной команды. В связи с этим возникает вопрос о том, как дешифровать первую команду программы. Если предшествующая выполненная команда отсутствует, то каким образом вычислить первый ключ команды? В одном из вариантов осуществления настоящего изобретения первая команда программы остается незашифрованной, тогда как все остальные команды зашифровываются. Поэтому первая команда выполняется непосредственно, начиная тем самым цикл, а вторая команда дешифруется при помощи ключа команды, созданного на основе первой команды, и так далее. В другом варианте осуществления настоящего изобретения шифруется вся программа, включая первую команду, а ключ команды инициализируется при помощи значения, которое будет дешифровывать первую команду. Этим значением может быть главный ключ, который встраивается в модуль безопасности или иным образом передается модулю безопасности снаружи.
IN
OUT
OUT
OUT
OUT
OUT
OUT
IN
IN
При исполнении программы могут возникнуть обстоятельства, при которых к текущей команде (INSTC'), хранящейся в текущей ячейке памяти (С), могут обращаться несколько предыдущих команд (INSTP1, INSTP2). Иными словами, к текущей, или вызываемой, команде могут обращаться несколько (более одной) вызывающих команд, например, когда встречается команда передачи управления (включая, например, переход, ветвление или вызов). На ФИГ. 3 иллюстрируется сценарий, при котором две вызывающих команды (INSTP1, INSTP2) обращаются к одной вызываемой (INSTC). В этом случае, поскольку в связи с различной возможной предысторией ключ команды может иметь два различных значения, могут быть получены два различным результата в зависимости от того, какой ключ будет использоваться для дешифрования зашифрованной вызываемой команды. Это, конечно, не является желательной ситуацией, так как зашифрованная вызываемая команда могла быть зашифрована только одним ключом. Чтобы избежать этой проблемы, в вычисления вносится модификация (CORR1, CORR2), заставляющая итоговый ключ команды принять требуемое значение, чтобы правильно дешифровать вызываемую команду. Например, к вызываемой команде, расположенной в ячейке С, обращаются две различные вызывающие команды, расположенные в ячейках Р1 и Р2. Ключом команды, необходимым для правильного дешифрования зашифрованной команды в ячейке С (INSTC'), является ключ KC. Однако значение ключа команды после исполнения команды, расположенной в ячейке Р1 (INSTP1), составляет KР1, а значение ключа команды после исполнения команды, расположенной в ячейке Р2 (INSTP2), составляет KР2. Кроме того, разумно предположить, что KР1 не равно KР2, и что ни KР1, ни КР2 не равно KC. Поэтому данный способ требует выполнения модификации (CORR1, CORR2), позволяющей довести значение ключа команды до необходимого значения всякий раз, когда выполняется команда передачи управления. Поскольку известно как значение ключа, необходимое для дешифрования вызываемой команды (т.е. KC), так и значение ключа после исполнения вызывающей команды, существует возможность предвычисления модифицирующего значения для каждой вызывающей команды, причем это модифицирующее значение, используемое в вычислениях, доводит ключ команды до требуемого значения. Затем подходящее модифицирующее значение реализуется при каждой передаче управления, чтобы выполнить необходимую модификацию ключа команды каждый раз, когда используется этот тип команды, причем для каждой вызывающей команды выполняется иная модификация. Согласно одному из вариантов осуществления настоящего изобретения модифицирующее значение вводится в качестве дополнительного операнда в комбинацию предыдущего ключа дешифрования и дайджеста предыдущей команды, как описано выше.
В качестве примера выполнения описанной выше модификации ключа команды рассмотрим команду перехода. В предпочтительном варианте осуществления настоящего изобретения команда перехода содержит параметр назначения, как обычно бывает у команд перехода, а также параметр модификации, например, JMP С, #CORR1. Модифицирующее значение (#CORR1) используется затем в качестве дополнительного параметра в комбинации предыдущего ключа команды и всей предыдущей команды или ее части. Полезно отметить, что, извлекая модифицирующее значение из команды и используя его в качестве дополнительного параметра на шаге образования комбинации, дайджест команды перехода мог бы уже учитывать модифицирующее значение. Приведенная ниже таблица Т1 иллюстрирует состояние ключей команд по мере того, как в процессе выполнения программы реализуется модифицированная команда перехода описанного выше типа. Таблица содержит значение ключа, необходимое для дешифрования команды, и значение ключа после исполнения команды и вычисления нового ключа. Поскольку значение ключа, необходимое для дешифрования команды в метке1, известно, следовательно, соответствующие корректирующие значения CORR1 или CORR2 можно вычислить, чтобы довести немодифицированные величины K4 или K14 до требуемого значения K91.
Т1
Требуемый ключ
Метка
Команда
Итоговый ключ
K1
Команда 1
K2
K2
Команда2
K3
K3
JMP метка1, CORR1
K91=Fn(K4,CORR1)
K11
Команда 11
K12
K12
Команда12
K13
K13
JMP метка1, CORR2
K91=Fn(K14,CORR2)
K91
метка 1
Команда91
K92
K92
Команда92
K93
В другом варианте осуществления настоящего изобретения вместо получения, например, модифицированной команды перехода используется стандартная команда перехода, а модификация ключа команды, описанная выше, выполняется специальной «модифицирующей» командой с модифицирующим значением в качестве параметра. Функция такой модифицирующей команды состоит в том, чтобы воздействовать непосредственно на ключ команды, используя модифицирующее значение. Модифицирующая команда помещается непосредственно перед командой ветвления или перехода, тем самым обеспечивая возможность надлежащего обновления ключа команды, чтобы правильно дешифровать вызываемую команду. Полезно отметить, что функция «модификации», описанная выше, может по существу представлять собой набор команд, предназначенных для выполнения требуемой операции модификации над значением ключа команды. Например, если значение ключа команды, необходимое для правильного дешифрования вызываемой команды, составляет #39, то непосредственно, например, перед командой перехода может помещаться функция «Исключающее ИЛИ» ключа команды (KI), имеющего значение #39, в целях нахождения модифицирующего значения (CORR1), а затем команда суммирования CORR и KI для получения нового (скорректированного) значения KI.
В качестве другого примера, ключ команды на «метке1» вызываемой команды имеет значение К91. В связи с тем, что процесс выполнения программы может следовать разными путями, команда корректировки lnst_CORR добавляется непосредственно перед переходом так, чтобы ключ команды обновлялся до заданного значения К90. Исполнение команды передачи управления, которая в данном случае представляет собой команду перехода, модифицирует ключ команды, изменив его значение с K90 на K91. Как видно из таблицы Т2, корректирующее значение (С1, С2), связанное с командой корректировки (lnst_CORR), предназначено для модификации текущего ключа команды (K3, K13) до заданного значения K90. Вследствие этого исполнение команды перехода обновит ключ команды, изменив его с K90 на K91, значение, используемое для дешифрования команды, расположенной по адресу вызова (метка1).
В случае если команда передачи управления имеет другое значение, например, когда команда представляет собой короткое безусловное ветвление, дайджест, формируемый этой командой, будет отличаться от дайджеста, формируемого командой перехода. Вследствие этого корректирующее значение С3, присоединяемое к команде корректировки lnst_CORR, должно учитывать это различие, поэтому ключ команды при исполнении команды ветвления не будет таким же, как для команды перехода. Однако благодаря корректирующему значению С3 окончательное значение после исполнения команды короткого ветвления по-прежнему будет равно K91.
Т2
Требуемый ключ
Метка
Команда
Итоговый ключ
K1
Команда1
K2
K2
Команда2
K3
K3
lnst_CORR, C1
K90=Fn(C1,K4)
K90
Переход (JMP) к метке1
K91
K11
Команда11
K12
K12
Команда12
K13
K13
lnst_CORR, С2
K90=Fn(C2,K14)
K90
Переход (JMP) к метке1
K91
K20
Команда1
K2
K21
Команда2
K3
K22
Inst_CORR, С3
K80=Fn(C3,K23)
K80
Безусловное короткое ветвление (BRA) к метке1
K91
K91
метка
Команда91
K92
K92
Команда92
K93
Приведенная ниже таблица Т3 иллюстрирует состояние ключей команд по мере того, как в процессе выполнения программы реализуется команда условного перехода, где после исполнения условного перехода возможны два различных адреса назначения, метка1 и метка2. В этом случае ключ, необходимый для дешифрации команд, должен быть одним и тем же для обоих адресах назначения. Таблица содержит значение ключа, необходимое для дешифрования команды, и значение ключа после исполнения команды и вычисления нового ключа.
Т3
Требуемый ключ
Метка
Команда
Итоговый ключ
K91
L1
Команда1
K2
K2
Команда2
K3
K3
CORR=C1
K90
К90
JMPCONDL1, L2
K91
K11
Команда 11
K12
K12
Команда12
K13
K13
JMP L2, CORR2
K91
K91
L2
Команда91
K92
K92
Команда92
K93
Другой ситуацией, в которой к одной вызываемой команде могут обращаться несколько вызывающих команд, требуя тем самым выполнения модификации ключа команды, чтобы правильно дешифровать вызываемую команду, является вызов функции или вызов подпрограммы. Как правило, при данном типе вызова параметры могут передаваться во время вызова, увеличивая тем самым количество возможных различных потоков в рамках функции или подпрограммы и, соответственно, количество возможных исходов после исполнения функции или подпрограммы. Когда в программе встречается такой вызов, модификация ключа команды осуществляется таким образом, чтобы его состояние могло быть известно в начале выполнения функции или подпрограммы, при этом дополнительная модификация выполняется при возвращении из вызова, т.е. непосредственно перед выходом из функции или подпрограммы.
Следует отметить, что в контексте настоящего изобретения описанная выше модификация может просто повлечь за собой замену одного ключа другим.
Как хорошо известно специалистам в области обработки данных, любая команда содержит по меньшей мере код операции, определяющий выполняемую операцию. Команда может содержать только его, а также может дополнительно содержать один или несколько операндов, над которыми должна выполняться операция. В дополнение к операционному коду и операнду или операндам, если они существуют, команда может содержать аутентификационный признак, иначе известный как показатель целостности, который используется в качестве способа проверки достоверности команды. Соответственно, в другом варианте осуществления настоящего изобретения перед исполнением команды эта команда должна быть сначала проверена при помощи аутентификационного признака, как описано выше. Аутентификационный признак может принимать форму контрольной суммы или хеш-значения всего операционного кода и операнда (-ов) или их части. В большинстве случае аутентификационный признак можно рассматривать в качестве сигнатуры кода операции. Таким образом, при шифровании всей команды или ее части мы сталкиваемся с выбором, шифровать ли только код операции или код операции вместе с аутентификационным признаком, или включить также и операнд(ы). Любая комбинация упомянутых компонентов даст желаемый результат, однако в случаях, когда важно скрыть контент программы от третьей стороны, в настоящем изобретении предпочтительнее осуществить шифрование кода операции и аутентификационного признака, поскольку аутентификационный признак может дать потенциальному злоумышленнику подсказку о том, что может представлять собой код операции. Таким образом, способ, применяемый в этом варианте осуществления настоящего изобретения, включает в себя считывание текущей зашифрованной команды; использование ключа команды для дешифрования текущей зашифрованной команды и аутентификационного признака; проверку извлекаемого таким образом аутентификационного признака; обновление ключа команды при помощи вычисления на основе текущего значения ключа команды (или его дайджеста) и дайджеста текущей команды, чтобы следующую считываемую зашифрованную команду можно было дешифровать при помощи обновленного ключа команды; исполнение текущей команды при условии, что аутентификационный признак был признан действительным. Если аутентификационный признак не признается действительным, программу можно заставить завершить исполнение корректно, т.е. генерируя надлежащий аварийный сигнал.
Поскольку в некоторых случаях, когда может быть реализовано настоящее изобретение, его целью необязательно может являться предотвращение возможности копирования компонента программного обеспечения третьей стороной, а лишь предотвращение возможности изменения программного обеспечения третьей стороной без обнаружения такого изменения, существует вариант осуществления, в котором коды операций команд оставляют незашифрованными, а зашифровывают только аутентификационные признаки. Этого достаточно для достижения цели, состоящей в гарантировании целостности программного обеспечения, возможность которого предоставляет настоящее изобретение. Аналогичным образом, в другом варианте осуществления можно зашифровать только операнды, если последние существуют. Точно так же возможно шифрование любого кода операции, операндов или аутентификационных признаков, или любой иной их комбинации.
Аналогичным образом, в одном из вариантов осуществления настоящего изобретения можно сохранять код операции и операнды незашифрованными, и шифровать только часть аутентификационного признака. Тогда в случае перехода вместо использования модифицирующего значения, как описано выше, можно просто отключить проверку аутентификационного признака после команды перехода. Преимущество этого решения состоит в том, что команда перехода не потребует при этом модифицирующего значения.
Таким образом, в настоящем изобретении предлагается решение проблемы гарантирования целостности программных продуктов путем шифрования каждой команды программы, полностью или частично, при помощи ключа, полученного на основе, полностью или частично, одной или набора предыдущих команд, что позволяет получить иной ключ шифрования для каждой команды. Настоящее изобретение применимо к программным продуктам, структуры которых необязательно являются древовидными по своему характеру, и может применяться также, когда программа включает циклы, переходы, вызовы или прерывания и т.д. Изобретение позволяет помечать исключение, когда зашифрованная команда была неверно дешифрована. Первая команда необязательно должна быть незашифрованной, поскольку ключ команды может быть соответствующим образом инициализирован при необходимости. Настоящее изобретение может быть реализовано программными средствами или только аппаратными средствами, исключая с их помощью возможность перехвата дешифрованной команды или ключа дешифрования третьей стороной.
При шифровании команды может использоваться один из целого ряда алгоритмов, таких как поточное шифрование, блочное шифрование, шифрование одноразовым ключом, скремблирование, например, с помощью побитовой инверсии, битового сдвига, перестановки битов, алгоритма паритетного контроля или циклического избыточного кода.