gifts2017

Пример шифрования данных.

Опубликовал Андрей Скляров (coder1cv8) в раздел Программирование - Защита и шифрование

Обработка представляет собой простой пример шифровки/дешифровки произвольного текста, без использования внешних библиотек, средствами Windows (c помощью объекта «CAPICOM.EncryptedData»). Если capicom.dll всё же нет в Вашей версии Windows - то её можно скачать здесь же.
Использование данного подхода на практике, можно увидеть в моей разработке «Обфускация кода 1С» ( http://infostart.ru/projects/2057 ).

+ Бонус от Abadonna!
Encipher - внешнее приложение, всё то же самое, но без использования 1С. :)

Скачать файлы

Наименование Файл Версия Размер
Encipher.zip 538
.1227601701 252,40Kb
25.09.09
538
.1227601701 252,40Kb Бесплатно
capicom.dll 591
.1227175352 456,00Kb
25.09.09
591
.1227175352 456,00Kb Бесплатно
Encrypt.zip 679
.1227168937 4,84Kb
25.09.09
679
.1227168937 4,84Kb Бесплатно

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Андрей Скляров (coder1cv8) 20.11.08 11:33
Ей также можно дешифровать строки после моего обфускатора, только т-с-с-с! )
2. Дмитрий Воробьев (vde69) 20.11.08 12:20
давно хотел поиграться на эту тему, а тут повод :)
конечно все простенько

кстати можно нельзя шифровать несколькими ключами?
3. Андрей Скляров (coder1cv8) 20.11.08 12:34
(2) Что значит несколькими? Типа массива из нескольких строк?... Нет, насколько я знаю...
4. Дмитрий Воробьев (vde69) 20.11.08 12:39
(3) нет я имею в виду шифрование с резервным ключем, тоесть есть 2 ключа (разных), мы шифруем и расшифровать можно любым из этих двух.

например шифрование дисков так сделано, в случае утраты ключа можно расшифроврать ключем администратора
5. Дмитрий Воробьев (vde69) 20.11.08 12:41
кстати EncryptedData - не штатная библиотека, (укажи в загаловке ссылку на скачивание) хотя и халявная
6. Андрей Скляров (coder1cv8) 20.11.08 12:45
(4) Вот насчет этого не в курсе... Вот описание Crypto API в msdn: http://msdn.microsoft.com/en-us/library/aa380254(VS.85).aspx там есть ответ, я в англицком не силен, к сожалению! (
7. Дмитрий Воробьев (vde69) 20.11.08 12:51
(6) похоже, что можно... хотя надо будет попробовать, может вечером поиграюсь
Тут можно прикольную систему сделать...
8. Роман Ершов (MRAK) 20.11.08 12:54
При нажатии "дешифровать" выдает "Ошибка при вызове конструктора (COMОбъект): Недопустимая строка с указанием класса"
9. Роман Ершов (MRAK) 20.11.08 12:55
а, ясно... качать надоть...
10. Андрей Скляров (coder1cv8) 20.11.08 12:56
(5) Вроде же входит в состав Windows?...
ЗЫ: У кого нету можно скачать тут: http://www.microsoft.com/downloads/details.aspx?FamilyID=860ee43a-a843-462f-abb5-ff88ea5896f6&DisplayLang=en
11. Андрей Скляров (coder1cv8) 20.11.08 13:04
Для тех у кого по каким-то причинам (ха-ха) не получается скачать с сайта microsoft, добавил dll-ку в шапку.
12. Роман Ершов (MRAK) 20.11.08 13:50
Теперь:
{Форма.Форма(29)}: Ошибка при вызове метода контекста (SetSecret): Произошла исключительная ситуация: Параметр задан неверно.
Пытаюсь расшифровать код "Обфускация кода 1С")))
elena_angren77@mail.ru; +1 Ответить 1
13. Андрей Скляров (coder1cv8) 20.11.08 14:16
(12) Дык, задавай ключ верно, что ж ты хочешь! )
14. Алексей Плутенко (Noy) 20.11.08 14:36
Учитывая (10) думаю что обработку надо переименовать - "штатно" уже не катит...
15. Андрей Скляров (coder1cv8) 20.11.08 14:46
(14) А кто бы подсказал в каких виндах этой длл-ки нету?... ) Похоже от ХР и выше?...
16. Алексей Плутенко (Noy) 20.11.08 15:56
(15) у меня на ноуте ХР СП3 - длл-ки нет...
17. Андрей Скляров (coder1cv8) 20.11.08 17:19
(16) Хм, странно... У меня XP Prof SP2 dll-ка есть.
Ладно, в любом случае, шапку переименовал и сюда библиотеку положил )
18. Сергей Лунев (luns) 20.11.08 19:05
coder1cv8 красвчик!!! Всегда плюсую авансом...
19. Василий Демидов (Душелов) 21.11.08 01:34
Вот из-за таких, как он decode для 1С-ки не нужна будет :)
20. Андрей Скляров (coder1cv8) 21.11.08 09:52
Добавил генерацию ключа :)
21. Аркадий Кучер (Abadonna) 24.11.08 08:18
(0) Я тут от не фиг делать написал внешнее приложение для шифрования. На разработку, по моим понятиям, как-то не тянет, если хочешь - кину тебе на мыло, прицепишь еще файлик ;)
(тоже с генерацией ключа - GUID)
luns; olga1974; Yasen; vasilykushnir; JohnyDeath; ded00786; coder1cv8; +7 Ответить 1
22. Андрей Скляров (coder1cv8) 24.11.08 09:30
(21) Давай, кидай. Отчего же не прицепить? )
23. Андрей Скляров (coder1cv8) 24.11.08 09:32
24. Дмитрий Воробьев (vde69) 24.11.08 18:42
ну собствено как я и говорил, ты меня сподвиг на подвиг :) сделал идентификацию изменения критических полей элементов базы по хешу http://infostart.ru/projects/2964/
25. Герман (German) 25.11.08 09:45
а зная закодированный фрагмент и результат можно вычислить ключ?
26. Андрей Скляров (coder1cv8) 25.11.08 10:07
(25) Ну насколько я знаю, абсолютно надежных алгоритмов шифрования нет ) Кстати, ты заметил, каждое повторное шифрование одних и тех же данных, одним и тем же ключем, дает различающийся результат.
ЗЫ: Вот здесь http://www.inattack.ru/article/472.html можно почитать про Crypto API на русском.
27. Дмитрий Воробьев (vde69) 25.11.08 10:22
(25) если это MD5 то практически нет (а там пожно юзать MD5), есть статьи по этому, в отдельных случаях подломать можно, но это исключение.
ХЕШ MD5 ломают по таблицам извесных хешей, кстати виндовые пароли именно на хешах MD5 базируються
28. Василий (ded00786) 25.11.08 11:28
А как насчет графического шифрования?
Это так, информация к размышлению ;)
29. Андрей Скляров (coder1cv8) 25.11.08 11:32
Добавил утилитку написанную Abadonna. Плюсики ему можно поставить здесь же в комментах :)
30. Василий (ded00786) 25.11.08 11:37
31. Sasha_H (logarifm) 08.12.08 15:10
32. Владимир Пушин (vladnet) 26.12.08 09:16
У меня вот такая ошибка: {Форма.Форма(30)}: Ошибка при вызове метода контекста (Decrypt): Произошла исключительная ситуация: Встречено неверное значение тега ASN1.

Библиотеку выкачал, хотя она и была и зарегил.
33. Аркадий Кучер (Abadonna) 26.12.08 09:22
(32) Ха! У меня как раз такое на 7-ке вчера было, когда восстанавливал зашифрованные пароли пользователей из базы по учету всякой хрени ;)
После шифрования заменил символы перевода строки на ‡ перед запистью в справочник (dbf), а при считывании - опять меняю ‡ на РазделительСтрок. Так взлетело
34. Владимир Пушин (vladnet) 26.12.08 09:36
(33) В исходном тексте не встречается переводов строк (

Да ошибка вылетает как в обработке 1с, так и в твоем Encipher

Кстати а можно ли с помощью этой библиотеки шифровать 2 ключами:
один для шифрования, другой для расшифрования?
35. Андрей Скляров (coder1cv8) 26.12.08 09:38
Действительно, получается что-то с зашифрованными данными не так...
36. Андрей Скляров (coder1cv8) 26.12.08 09:39
(34) А перешифрование исходного текста не помогает?...
37. Аркадий Кучер (Abadonna) 26.12.08 09:39
(34) Ты Encipher запусти, набери, например, слово "молоко" и зашифруй.
Сколько строчек внизу будет? ДВЕ! Думаешь я сам их там так разбил? Ни фига, там образовался при шифровании символ перевода строки
38. Аркадий Кучер (Abadonna) 26.12.08 09:41
+(37) А вот при записи уже в базу (в дбф уж - точно) - происходит корявая запись в поле
39. Андрей Скляров (coder1cv8) 26.12.08 09:42
(37) По моим наблюдениям перевод строки в шифрованном тексте сделан исключительно для удобства. В частности, в моем "Обфускаторе" я совсем убираю переводы строк из шифрованного текста, на расшифровку это никоим образом не влияет!
40. Аркадий Кучер (Abadonna) 26.12.08 09:44
(39) Ну попробуй ради интереса записать в dbf строку "мама"+РазделительСтрок+"папа" и погляди, что запишется
41. Владимир Пушин (vladnet) 26.12.08 09:44
(34) Перешифрование не помогает, пробовал разные алгоритмы
(38) Так я ведь в ДБФ не пишу, пробовал убрать переводы не помогает (
42. Аркадий Кучер (Abadonna) 26.12.08 09:45
(41) Ну не знаю.. Именно так я вчера победил её
43. Владимир Пушин (vladnet) 26.12.08 09:46
(40) пока совсем не понял при чем тут ДБФ?
Все происходит внутри одной обработки. Понимаю что там может быть разные переводы.
44. Андрей Скляров (coder1cv8) 26.12.08 09:46
(41) Можно пример текста и ключ?...
45. Владимир Пушин (vladnet) 26.12.08 09:47
(44)

молоко
237541f0ca3e432ba2dbac92485d1207
46. Андрей Скляров (coder1cv8) 26.12.08 09:47
ДБФ тут ни причем! Это Абадонна о своем, о наболевшем наверно ))
47. Аркадий Кучер (Abadonna) 26.12.08 09:49
(46) О каком наболевшем? У меня все базы на скуле, но не делать же на нем и вшивенькую базу по учету компов-паролей-логинов...
48. Андрей Скляров (coder1cv8) 26.12.08 09:52
(45) У меня проблема не воспроизводится.
(47) Та я шучу! )
49. Владимир Пушин (vladnet) 26.12.08 09:52
У меня почему то всегда эта ошибка вылезает, даже если ключом неправильным расшифровывать. Может и прав Абадонна, проблема в переводах строки, то что 1с автоматом заменяет переводы строк на свои, хотя вроде бы не должен. Сейчас проверю.
50. Андрей Скляров (coder1cv8) 26.12.08 09:57
51. Владимир Пушин (vladnet) 26.12.08 10:02
Все извиняюсь неправильно понял то как работает обработка - думал что она при дешифровании берет нижнее поле дешифрует его и в верхнее поле засовывает, оказалось нужно копировать из нижнего в верхнее и потом только дешифровать.
52. Андрей Скляров (coder1cv8) 26.12.08 10:04
53. Аркадий Кучер (Abadonna) 26.12.08 10:12
54. Владимир Пушин (vladnet) 26.12.08 10:14
(52) (53) Ну я бы так сделал, чтобы тестировать было удобнее (
55. Аркадий Кучер (Abadonna) 26.12.08 10:16
(54) И нашелся бы человек, который понял все правильно, и начал вставлять в верхнее окошко, и недоумевал бы почему оно не пашет :)))
56. Владимир Пушин (vladnet) 26.12.08 10:19
(55) По любому )

А все таки не смотрели как можно шифровать 1 ключом, а расшифровывать другим. Один ключ публичный для расшифровки, другой для шифрования.
57. Андрей Скляров (coder1cv8) 26.12.08 10:37
(56) Crypto API это позволяет, а объект CAPICOM, в свою очередь поддерживает практически все возможности Crypto API. Как это реализовать на практике, я лично, не задумывался... Я здесь давал уже ссылку, по-моему, на описание Crypto API на русском, почитай...
ЗЫ: Это называется асимметричный алгоритм )
58. Владимир Пушин (vladnet) 26.12.08 11:01
Читаю, пока не разобрался (
59. MTM (BOZKURT) 13.01.09 00:51
60. MTM (BOZKURT) 13.01.09 00:55
по поводу ошибки http://infostart.ru/profile/657/
я с третьей попытки допер.. :)
61. Андрей Скляров (coder1cv8) 13.01.09 07:42
(60) А я то думал это очевидно! :)
62. Олег (mov68) 11.11.09 14:34
Вопрос к спецам: есть ли шэш функции и как к ним обратиться, или плиз ссылку толковую на функции DDL.
63. xvas (xvas) 29.09.11 14:28
64. igor sarafanov (ms200999) 22.11.11 14:24
(63)Согласен.
Сохранил в закладки.
65. muha muhaha (fr.myha) 16.07.13 11:15
Конечно код 1С можно защищать с помощью сложных программно-аппаратных решений(ключи, специальные продукты для защиты конфигураций), и соответственно, на защиту надо тратить немалые средства и время. А если стоимость разработки находится в переделах 3-5 тысяч рублей, тогда затраты на защиту превышают стоимость самой разработки.

Но не все так грустно. Достаточно вспомнить, что защита от взлома – понятие скорее экономическое. Поэтому для недорогих программных продуктов вполне можно создать защиту, по крайней мере, не дающую свободно тиражировать продукт.
Структура предлагаемой нами защиты следующая:
Внешняя компонента (ВК), выполняющая расшифровку Защищенного Модуля и его загрузку.
Стартовая Обработка (СО), выполняющая роль загрузчика ВК, а также хранящая Защищенный Модуль в виде макета (двоичных данных).
Защищенный Модуль (ЗМ) в зашифрованном виде, загружаемый только через ВК.

Технология защиты проста. Достаточно вынести программный код в модуль объекта ЗМ, организовать вызовы процедур из него, затем зашифровать ЗМ и загрузить в макет. Загрузка ЗМ может выглядеть следующим образом:

http://protect1c.ru/sites/default/files/protect_1c_pic1.png
Загрузка ВК (Addin.dll) и пример работы с защищенным модулем на странице http://protect1c.ru/modules-for-1c
Шифрование кода в ЗМ на странице http://protect1c.ru/upload4code (необходима регистрация на сайте protect1c.ru)
Данная технология работает только для традиционного толстого клиента 1С (обычного приложения )
Несколько замечаний по уязвимости, предваряя флейм на тему «это не защита».
Недостатком этого способа, как неоднократно отмечалось, является необходимость наличия расшифрованной обработки в виде файла на диске. Однако, на самом деле, недостаток этот не так велик, как кажется. Во-первых, время жизни этого файла сведено к минимуму, во-вторых, в модуле объекта ЗМ есть смысл написать следующую строчку:
http://protect1c.ru/sites/default/files/protect_1c_pic2.png
Такая строка не приводит к неработоспособности обработки, но затрудняет отладку. Не следует пренебрегать и стандартными способами защиты: установка пароля на код модуля объекта, поставка без исходных текстов, обфускация кода (http://nashe1c.ru/materials-view.jsp?id=121). При выполнении этих условий вскрытие кода становится достаточно непростой задачей.
Много говорилось о наличии в каталоге %TEMP% файлов с байт-кодом загруженного модуля. Нами было проведено несколько экспериментов на эту тему. В результате выяснилось, что по крайней мере платформа версии 8.2.16.352 не создает файл с кодом МОДУЛЯ ОБЪЕКТА(!). В %TEMP% только модуль формы. Если у кого-то есть другая обоснованная информация – welcome в комментарии.
В ходе экспериментов выяснилось, что оператор Выполнить(СтрокаКоманды) (естественно!) не приводит к компиляции выражения, переданного как СтрокаКоманды, то есть байт-код для этих команд отсутствует. Этот факт предоставляет широкое поле для экспериментов на тему защиты кода. В скобках замечу, что нам так и не удалось заставить выполняться команду выполнить внутри ВК, (злополучный method not supported by automation object () ). Если у кого-то получится – welcome в комментарии.
Достоинством данного подхода является отсутствие необходимости перекомпилировать код ВК, а также то ,что весь код может быть написан только на 1С. Единственной операцией вне рамок 1С программирования является шифрование ЗМ.
66. Дмитрий Акифьев (akifjevda) 18.11.13 14:31
Ребята, подскажите такую штуку. Шифрую строку по AES-128 (по факту - XML документ) с помощью capicom.dll и получаю зашифрованную строку. Как я понял она сразу обработана через base64. Проблема в том, что не могу расшифровать в php через mcrypt (алгоритм MCRYPT_RIJNDAEL_128). Даже если просто зашифровать mcrypt эту же строку, то зашифрованный вариант получается совсем другой чем в 1С или в Encipher.exe и примерно 2 раза короче. Где могут быть грабли?

PS Немного разобрался в вопросе. CAPICOM заворачивает свой ответ в структуру ASN.1 для передачи бинарных данных и передает в структуре и алгоритм шифрования и длину ключа и сам зашифрованный поток и похоже вектор инициализации. Но все равно не могу расшифровать стандартными средствами php эти данные, уже все варианты перепробовал.

Может кто-нибудь подсказать как указать capicom что надо шифровать в режиме ECB (чтобы не использовать вектор инициализации при расшифровке) и выдавать наружу только зашифрованный кусок, а не структуру???
67. Максим Кузьмин (teorver) 19.02.15 10:37
(1) coder1cv8, Один умник до меня сделал обфускацию общего модуля... теперь сижу и парюсь, не могу обратно все вернуть, а очень надо, ибо нужны изменения в этом модуле. Ума не приложу как де-обфускацию сделать :(