Здравстуйте,
Возник у меня такой вопрос, не знаю куда обратиться за дополнительной информацией.
Если результат выполнения программы представить как временной ряд состояний ячеек памяти и регистров процессора, то это получается текст. Если это текст, то его можно зашифрвать при помощи алгоритма с открытыми ключами (т.е. имея открытый ключ и цифер-текст можно получть сам текст, а восстановить закрытый ключ нельзя).
Теперь если представить, что открытым ключом является некоторый ключ сгенерированный на основе закрытого ключа + входные данные программы, то расшифровка текста по сути — выполнение программы. Если такое реализуемо, то теоретически можно создавать программы, которые в принципе нельзя декомпилировать (т.е. декомпилирование по сути будет означать подбор закрытого ключа, т.е. задача взлома цифертекста).
А вопрос состоит в том есть ли такие разработки на самом деле и кто ими занимается?
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
А выполнять такую жутко зашифрованную программу ты, собственно, как собираешься?
Компу-то надо знать кода твоей проги, чтобы их исполнить. Стало быть, придется расшифровывать. А если кода известны, дизассемблировать — не проблема.
Good Luck,
UT
Я же объяснил: исполнение программы — это сам процесс расшифровки, поскольку результат расшифровки — это не код программы, а результат её исполнения.
Сейчас попытаюсь уяснить. Значит, есть у меня алгоритм решения квадратного уравнения. Скажем, Q(a,b,c) = {x1, x2}
Я его программирую в машинные кода и получаю текст qT (не сильно важно, какой).
Теперь я заворачиваю qT в другую функцию, Exec(key, text), которая берет текст, ключ, извлекает из ключа данные для программы, из текста — саму программу и исполняет программу на данных. Правильно я понял? То есть, к процессору поступает
Exec(key(password, {a,b,c}), qT)
в машинных кодах. Правильно я тебя понимаю?
Тогда вопрос — чем этот механизм отличается от того, что называется операционной системой?
Good Luck,
UT
Нет.
На основе данных, ключа и цифе-кода программы извлекается сразу результат. Алгоритм дешифрования так устроен, что выполнения расшифровки — это и есть в том числе вычислительная процедура (именно для данного цифер-кода и для конкретных входных данных)
В таком случае, объясни, как именно он устроен, потому как способа отличного от приведенного мной, не вижу.
Попробуй на примере того же квадратного уравнения.
Good Luck,
UT
В том то и дело, что я пока только подумал о том, что это теоретически возможно!
Как это может быть? А как может быть то, что имея открытый ключ цифертекста можно его расшифровать, а обратно зашифровать нельзя!? — математика такая
Тут видимо как-то завязано на вычислимости алгоритмов и сложности алгоритмов, надо видимо было вместо нелинейных дифуров мне дискрматы посещать.
Я не знаю как это подробнее пояснить — мне знаний не хватает, я по этому и спросил о том есть ли подобные исследования
Я тут подумал, кое какие мысли для возможного объяснения появились.
В ООП стараются максимально разделить код и данные, что если пойти другим путём? Максимально их смешать (что-то подобное делают ребята соревнующиеся в написании нечитаемых программ www.ioccc.org). Результат выполнения комманды некоторого процессора изменяет содержимое коммандной ячейки, которая стоит на очереди на выполнение одной из следующих (кажется одна из моделей машины Тьюринга так устроена). Сама логика работы такого процессора задаёт новый стиль программирования, который в принципе не понятен обычному программисту и код такой машины не скажет практически ничего тому, кто его будет читать. Аналогичные вычислительные системы — нейронные сети (программа сети (веса связей между нейронами) не может быть понята обычным человеком).
Теперь берём программу из N вычислений, превращаем её в программу из k*N (где k>1) вычислений причём так, что восстановить исходный текст программы нельзя (поскольку преобразование одностороннее как DES) её можно только выполнить… может что-то в этом роде?
хочешь сказать, есть ли такие наработки, которые позволяют делать на основании «исходных данных» и «закрытого ключа» таким образом, чтобы после шифрования получилось «выходные даные"?
идея, конечно, интересная.
только здесь встаёт одна такая маленькая проблемка: время находжения необходимых пар.
сложность декриптования не в том, что подобрать ключ невозможно в принципе — перебор всегда (!!!) возможен, а дело во времени, которое требуется на перебор.
кто сказал, что генерация ключей, необходимых для проведения необходимых вычислений будет занимать разумное время? я не говорю, что короткое. я говорю — разумное.. :)
;)
Чтобы понять это замечание мне знаний явно не хватает…
Я ночью подумал, что тут надо пойти видимо от другого. От целей этого шифрования. А их может быть (на мой взгляд) три:
1. защита от выявления логики работы программы (т.е. защита от того, чтобы часть программы использовали в другом програмном продукте и защита от того, чтобы осуществить «взлом» программы, т.е. понять как она работает и передать на её вход такие данные, которые заставят программу выполнить несанкционированные для данного пользователя действия)
2. защита от видоизменения кода (вирусы, которые встраиваются в код, взломы защиты по серийным номерам или другие защиты, которые обходят переписывая часть исходников)
3. защита от копирования
Видимо это можно реализовать таким образом:
Исходный текст программы (машинный, после компиляции нормальным компилятором) ещё ппрогоняется специальным компилятором, который особым образом переделывает программу делает из неё maze. Основными принципами нового кода является смешение данных с кодом, полиморфизм и использование всех возможных ошибок программирования как способ управления кодом (например передача управления может осуществляться такими методами как преполнения буферов; при этом это должно быть нормальным режимом работы программы)
ой-ёй.
это же что, при компиляции программы учитывать все возможные состояния конечного автомата (здесь: программы)?
просто иначе будет нельзя определиться с выходными данными и методом дополнительного кодирования, необходимого для получения выходных данных.
т.е. на очень ограниченном надобре данных — это ещё кое-как, но возможно, а для бОЛьшего.. нуу..
не знаю.