Шифрование и расшифровка строковых полей справочников методом Виженера (с улучшениями)

03.01.17

Разработка - Защита ПО и шифрование

Обработка по шифрованию и расшифровке строковых полей справочников модифицированным методом Виженера - реализация без внешних компонент, без com-объектов, чистый 1С.

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

Наименование Файл Версия Размер
ШифрованиеСтроковыхПолейСправочников.epf
.epf 18,61Kb
48
.epf 1.02 18,61Kb 48 Скачать
ШифрованиеСтроковыхПолейСправочников.epf
.epf 18,58Kb
8
.epf 1.01 18,58Kb 8 Скачать

Хочу поделиться примером реализации обработки по шифрованию/расшифровке произвольных текстовых полей справочников. Требования перед разработкой я поставил следующие:

  1. Должен быть реализован функционал шифрования и расшифровки по паролю;
  2. Зашифрованные данные должны храниться в полях исходных данных, т.е. длина зашифрованного текста должна быть равной длине исходного текста, дополнительных таблиц быть не должно;
  3. Список полей для шифрования/расшифровки должен быть настраиваемым и не зависеть от конфигурации;
  4. Шифрование должно выполняться средствами платформы 1С без внешних компонент, com-объектов и т.д., чтобы исключить зависимость от ОС;

Решений на Инфостарте по шифрованию/расшифровки строк огромное множество (Защита и шифрование) - практически на любой вкус. Приведу наиболее интересные (на мой субъективный взгляд):

  1. Подсистема шифрования данных + пример реализации: решение Keystore для хранения паролей;
  2. Симметричное шифрование в 1С;
  3. Шифрование текста, хеш сумма;
  4. Хеширование данных с ключом по алгоритму SHA-1 штатными средствами 1С;
  5.  Шифратор и дешифратор текста и файлов для 1С

Однако, найти публикацию, отвечающую всем моим требованиям, так и не удалось. Из-за наличия требования №2 (о не превышении длиной зашифрованного текста длины исходного текста), в качестве метода шифрования был выбран шифр Виженера.
Да, по современным стандартам данный шифр является ненадежным и поддается взлому. Поэтому, чтобы повысить время на дешифровку текста, в базовый алгоритм были внесены следующие улучшения:

  1. Ключ для шифрования формируется на основании пароля, длина ключа шифрования равна длине шифруемого текста;
  2. Код каждого символа ключа шифрования равен коду соответсвующего символа пароля, смещенного на псевдо случайную величину А;
  3. Псевдо случайная величина А зависит от максимального кода среди символов пароля и длины кодируемой строки;
  4. Код каждого символа зашифрованной строки равен сумме кода соответствующего символа исходной строки, кода соответствующего символа ключа шифрования и псевдо-случайной величины В;
  5. Псевдо случайная величина В зависит от максимального кода среди символов ключа шифрования и длины кодируемой строки;

 Для генерации псевдо случайных величин использовался встроенный объект платформы "ГенераторСлучайныхЧисел". Ниже приведны основные функции обработки:

  1. Функция ПолучитьМаксимальныйКодСимволаСтроки - получает максимальный код символа в переданной строке : 
    Функция ПолучитьМаксимальныйКодСимволаСтроки(СтрокаАнализа)
    	
    	ДлинаСтрокиАнализа = СтрДлина(СтрокаАнализа);
    	
    	МаксимальныйКодСимвола = 0;
    	
    	Для Счетчик = 1 По ДлинаСтрокиАнализа Цикл
    				
    		КодТекущегоСимвола = КодСимвола(СтрокаАнализа, Счетчик);
    		
    		Если КодТекущегоСимвола > МаксимальныйКодСимвола Тогда
    			
    			МаксимальныйКодСимвола = КодТекущегоСимвола;
    			
    		КонецЕсли;
    		
    	КонецЦикла;
    	
    	Возврат МаксимальныйКодСимвола;
    	
    КонецФункции

  2. Функция ПолучитьКлючШифрования - получает по паролю ключ шифрования с учетом псевдо случайного смещения:
    Функция ПолучитьКлючШифрования(лПароль, ДлинаКодируемойСтроки)
    	
    	лПароль_Длина 	= СтрДлина(лПароль);
    	КлючШифрования	= "";
    	
    	ЧислоДляИнциализацииГенератораСлучаныхЧисел = ПолучитьМаксимальныйКодСимволаСтроки(лПароль_Длина);
    	
    	ЧислоДляИнциализацииГенератораСлучаныхЧисел = ЧислоДляИнциализацииГенератораСлучаныхЧисел + ДлинаКодируемойСтроки;
    	
    	ГенераторСлучаныхЧисел = Новый ГенераторСлучайныхЧисел(ЧислоДляИнциализацииГенератораСлучаныхЧисел);
    	
    	СчетчикПоПаролю = Неопределено;
    	
    	Для Счетчик = 1 По ДлинаКодируемойСтроки Цикл
    		
    		Если (СчетчикПоПаролю = Неопределено) ИЛИ (СчетчикПоПаролю > лПароль_Длина) Тогда
    			
    			СчетчикПоПаролю = 1;
    				
    		КонецЕсли;
    		
    		СлучайноеСмещение = ГенераторСлучаныхЧисел.СлучайноеЧисло(1, ЧислоДляИнциализацииГенератораСлучаныхЧисел);
    				
    		СимволПароля = Сред(лПароль, СчетчикПоПаролю, 1);
    		
    		КлючШифрования = КлючШифрования + Символ(КодСимвола(СимволПароля) + СлучайноеСмещение);
    		
    		СчетчикПоПаролю = СчетчикПоПаролю + 1;
    		
    	КонецЦикла;
    	
    	Возврат КлючШифрования;
    	
    КонецФункции

  3. Функция ЗашифроватьСтроку - шифрует строку шифром Виженера по ключу шифрования с учетом псевдо случайного смещения:
    Функция ЗашифроватьСтроку(КодируемаяСтрока, КлючШифрования)
    	
    	ДлинаКодируемойСтроки = СтрДлина(КодируемаяСтрока);
    	
    	ЧислоДляИнциализацииГенератораСлучаныхЧисел = ПолучитьМаксимальныйКодСимволаСтроки(КлючШифрования);
    	
    	ЧислоДляИнциализацииГенератораСлучаныхЧисел = ЧислоДляИнциализацииГенератораСлучаныхЧисел + ДлинаКодируемойСтроки;
    	
    	ГенераторСлучаныхЧисел = Новый ГенераторСлучайныхЧисел(ЧислоДляИнциализацииГенератораСлучаныхЧисел);
    	
    	ЗакодированнаяСтрока = "";
    	
    	Для Счетчик = 1 ПО ДлинаКодируемойСтроки Цикл
    		
    		КодСимволаИсходнойСтроки 	= КодСимвола(КодируемаяСтрока, Счетчик);
    		КодСимволаКлючаШифрования 	= КодСимвола(КлючШифрования, Счетчик);		
    		СлучайнаяСоставляющая 		= ГенераторСлучаныхЧисел.СлучайноеЧисло(1, ЧислоДляИнциализацииГенератораСлучаныхЧисел);
    		
    		КодЗакодированныгоСимвола = КодСимволаИсходнойСтроки + КодСимволаКлючаШифрования + СлучайнаяСоставляющая;
    		
    		ЗакодированнаяСтрока = ЗакодированнаяСтрока + Символ(КодЗакодированныгоСимвола);
    		
    	КонецЦикла;
    	
    	Возврат ЗакодированнаяСтрока;
    	
    КонецФункции

  4. Функция РасшифроватьСтроку - расшифровывает строку по ключу шифрования с учетом псевдо случайного смещения:
    Функция РасшифроватьСтроку(КодируемаяСтрока, КлючШифрования)
    	
    	ДлинаКодируемойСтроки = СтрДлина(КодируемаяСтрока);
    	
    	ЧислоДляИнциализацииГенератораСлучаныхЧисел = ПолучитьМаксимальныйКодСимволаСтроки(КлючШифрования);
    	
    	ЧислоДляИнциализацииГенератораСлучаныхЧисел = ЧислоДляИнциализацииГенератораСлучаныхЧисел + ДлинаКодируемойСтроки;
    	
    	ГенераторСлучаныхЧисел = Новый ГенераторСлучайныхЧисел(ЧислоДляИнциализацииГенератораСлучаныхЧисел);
    	
    	ЗакодированнаяСтрока = "";
    	
    	Для Счетчик = 1 ПО ДлинаКодируемойСтроки Цикл
    		
    		КодСимволаКлючаШифрования 	= КодСимвола(КлючШифрования, Счетчик);			
    		КодЗакодированныгоСимвола 	= КодСимвола(КодируемаяСтрока, Счетчик);
    		СлучайнаяСоставляющая 		= ГенераторСлучаныхЧисел.СлучайноеЧисло(1, ЧислоДляИнциализацииГенератораСлучаныхЧисел);
    		
    		КодСимволаИсходнойСтроки = КодЗакодированныгоСимвола - КодСимволаКлючаШифрования - СлучайнаяСоставляющая;
    		
    		ЗакодированнаяСтрока = ЗакодированнаяСтрока + Символ(КодСимволаИсходнойСтроки);
    		
    	КонецЦикла;
    	
    	Возврат ЗакодированнаяСтрока;
    	
    КонецФункции

  5. Функция ЗашифроватьРасшифроватьПолеОбъекта - получает ключ шифрования по паролю и шифрует или расшифровывает строку в зависимости от входных параметров:
    Процедура ЗашифроватьРасшифроватьПолеОбъекта(ЗначениеРеквизита, Пароль, ЗаписатьЭлемент, ЭтоШифрование)
    	
    	Если НЕ ПустаяСтрока(ЗначениеРеквизита) Тогда
    		
    		КлючШифрования = ПолучитьКлючШифрования(Пароль, СтрДлина(ЗначениеРеквизита));
    		
    		Если ЭтоШифрование Тогда
    			
    			ЗначениеРеквизита = ЗашифроватьСтроку(ЗначениеРеквизита, КлючШифрования);
    			
    		Иначе
    			
    			ЗначениеРеквизита = РасшифроватьСтроку(ЗначениеРеквизита, КлючШифрования);
    			
    		КонецЕсли;
    			
    		Если НЕ ЗаписатьЭлемент Тогда
    			
    			ЗаписатьЭлемент = ИСТИНА;
    			
    		КонецЕсли;
    		
    	КонецЕсли;
    	
    КонецПроцедуры

Фактическая реализация алгоритма в виде обработки в приложенном файле. Интерфейс обработки интуитивно понятен. Для выполнения шифрования (или расшифровки) необходимо выполнить несколько простых шагов: 

  1. Выбрать поля данных в базе для обработки (при нажатии на гиперссылку с надписью "Обработать:" открывается отдельная форма с деревом справочников конфигурации со всеми текстовыми реквизитами и табличными частями с текстовыми реквизитами;
  2. Ввести пароль;
  3. Ввести подтверждение пароля;
  4. Нажать кнопку "Зашифровать" или "Расшифровать" в зависимости от требуемого действия. 

В качестве примера работы алгоритма приложены скриншоты со справочником "Страны" до шифрования и после шифрования.  На этом все, спасибо за внимание, надеюсь, кому-нибудь пригодится.

Конструктивная критика приветствуется! 

Шифрование метод Виженера

См. также

Запрет глобального поиска в конфигурации

Защита ПО и шифрование Платформа 1С v8.3 1С:Бухгалтерия 3.0 Абонемент ($m)

Представляю вам микрорасширение, которое запрещает глобальный поиск по вашей конфигурации.

1 стартмани

09.02.2023    2211    9    aximo    4    

2

Как защитить pdf файл

Защита ПО и шифрование Абонемент ($m)

Для установки защиты pdf документа, полученного в 1С, написано консольное приложение на c#., использующее одну зависимость pdfSharp.dll. В результате работы приложения ограничены операции над документом и записаны метаданные. С помощью аргументов командной строки можно управлять работой приложения.

2 стартмани

30.01.2023    1654    1    olevlasam    3    

3

Универсальный синтаксический анализатор ASN.1 для декодирования .key, .cer, .der, .p7m, .p7s, .crt, .pem

Защита ПО и шифрование Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Универсальный синтаксический анализатор ASN.1, который может декодировать любую допустимую структуру ASN.1 DER или BER, независимо от того, закодирована ли она в кодировке Base64 (распознаются необработанные base64, защита PEM и begin-base64) или в шестнадцатеричном кодировании.

1 стартмани

04.12.2022    2964    12    keyn5565`    0    

13

Шифрование строки на основе мастер-пароля в 1С Предприятие 8.3.19

Защита ПО и шифрование Платформа 1С v8.3 Абонемент ($m)

Демонстрация возможностей шифрования строки на основе мастер-пароля в 1С Предприятие 8.3.19. AES без zip файла, RSA, PKDF2. (c использованием библиотеки С# через com).

2 стартмани

31.08.2022    3812    7    vit59    2    

6

Обфускатор байт-кода

Защита ПО и шифрование Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Обработка, позволяющая запутывать и шифровать байт-код, поставлять модули без исходных текстов и т.д. Протестировано на платформе 8.3.23.1739.

10 стартмани

16.06.2022    10218    77    ZhokhovM    12    

39

Как уберечь конструкторскую документацию от воровства конкурентами?

Защита ПО и шифрование Платформа 1С v7.7 Платформа 1С v8.3 Абонемент ($m)

Как уберечь конструкторскую документацию от воровства конкурентами? Недавно столкнулся с этой проблемой. Заказчик серьёзно обеспокоен утечкой информации о конструкторских разработках в адрес конкурентов, за счет подкупа исполнителей, занимающихся производством по конструкторской документации, операторов технологического оборудования и обрабатывающих центров по изготовлению деталей и сборочных единиц.

2 стартмани

09.03.2022    5633    3    ge_ni    9    

2

Защита конфигураций, обработок, расширений 1С онлайн, управление версиями

Защита ПО и шифрование Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Система построена на веб платформе, все управление происходит на сайте в личном кабинете пользователя.

1 стартмани

27.12.2021    4544    2    idm80    11    

9
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Поручик 4670 27.04.16 07:57 Сейчас в теме
Интересно. Где бы это приспособить?
2. NikitaXa 112 27.04.16 08:23 Сейчас в теме
(1) Поручик, например, временное скрытие конфиденциальной информации в базе.
9. spectre1978 60 05.06.16 16:30 Сейчас в теме
(1) Ну наиболее типичное на мой взгляд применение - это если в объектах конфы хранятся имена-пароли (скажем от неких сторонних веб-сервисов, с которыми работает программа) и есть желание это дело немного прикрыть от посторонних глаз.
3. oleg_km 27.04.16 09:54 Сейчас в теме
У меня в базе хранятся зашифрованные пароли от всякий банк-клиентов так, чтобы их не мог прочитать ни администратор, ни программист. Но я использую для всякий шифрований .NET
4. altu71 27.04.16 10:24 Сейчас в теме
А не подскажите, сколько времени занимает шифрование/расшифровка этим методом на значительном объеме данных? Т.е. запись 10 000 элементов справочника без шифрования столько то, а этих же данных, но с шифрованием - столько то. Т.е. хочется узнать накладные расходы времени на шифрование.
5. NikitaXa 112 27.04.16 21:38 Сейчас в теме
(4) altu71, накладные расходы на шифрование будут напрямую зависеть от оборудования. Я делал замеры (5 циклов шифрования/расшифровки) на справочнике объемом около 6.000. Общее время записи элементов справочника плюс/минус равно (точность до секунды) общему времени записи элементов этих же элементов с шифрованием двух полей (номер телефона и электронная почта). Т..е .время шифрования незначительно по сравнению с временем записи элемента справочника в БД. Если скорость шифрования справочника неудовлетворительна из-за длительной записи элементов справочника, то всегда можно распараллелить этот процесс через фоновые задания.
6. bubus 26.05.16 02:30 Сейчас в теме
И какова стойкость такого метода интересно? Брутфорс пальцами конечно не вариант, а если из 1С обработки пробутфорсить, сколько времени займет интересно на строку из 10 символов (зашифрованный пароль)?
7. NikitaXa 112 26.05.16 23:07 Сейчас в теме
(6) bubus, вот здесь есть описание продолжительности перебора пароля в общем случае. Т.е. для 10 символов пароля получается 1162 года. Однако существуют различные методы расшифровки шифра Виженера, которые позволяют ускорить время расшифровки.
8. bubus 27.05.16 08:31 Сейчас в теме
(7) я уже глянул, да есть. И очень эффективный - частотный криптоанализ. https://habrahabr.ru/post/221485/ Жаль там ссылка на программу мертвая. Но, программа та работает с "обычным" Виженером, а у вас я так понял изменения некоторые с ключом, плюс не "алфавитный квадрат" а символьный. Но, было бы очень интересно посмотреть за сколько бы та программа справилась, если бы справилась вообще. Но, в любом случае ваша разработка мне кажется очень и очень полезной. Для мобильных приложений к примеру, где у нас нет возможности юзать .NET Framework для шифрования.
10. spectre1978 60 05.06.16 16:34 Сейчас в теме
(6) bubus, если нужна стойкость от реального взлома - Вижинер вряд ли подойдет. Это один из самых известных и простых методов шифрования.
Т.е. "защита от дурака". Для серьезных применений нужно использовать CryptoAPI и алгоритмы из него.
11. soulsteps 73 21.06.16 16:32 Сейчас в теме
Автор, сделай сортировку в списке выбора объектов. А так обработка супер. Как раз понадобилось шифрануть данные.
12. NikitaXa 112 22.06.16 11:30 Сейчас в теме
(11) soulsteps, приложена новая версия обработки с сортировкой дерева справочников по синониму.
soulsteps; +1 Ответить
13. dobrynin.i.s 92 03.01.17 19:13 Сейчас в теме
Уважаемый, попробовал на ут 11

{ВнешняяОбработка.ШифрованиеСтроковыхПолейСправочников.Форма.Форма.Форма(780)}: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос.Выполнить();
по причине:
{(16, 30)}: Неверные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов.
ИЛИ Таблица.ТекстоваяСтрока <<?>><> "")

убрал условие на непустую строку - обработка пишет зашифровано все, но результата не видно в справочнике
14. dobrynin.i.s 92 03.01.17 19:37 Сейчас в теме
(13) ф-я ЗашифроватьСтроку выдает пустой результат в любом случае цифры, кириллица. латиница
15. NikitaXa 112 03.01.17 22:40 Сейчас в теме
(14) Действительно, имела место ошибка в шифровании строковых реквизитов неограниченной длины. Исправленная версия обработки уже приложена к публикации. Для исправления ошибки в модуле формы необходимо заменить строку №734 замените с:
"| ИЛИ Таблица." + ИмяПоля + " <> """"";"
на:
"| ИЛИ ПОДСТРОКА(Таблица." + ИмяПоля + ", 1, 255) <> """"";".
dobrynin.i.s; +1 Ответить
16. пользователь 02.04.18 15:25
Сообщение было скрыто модератором.
...
17. Indgo 337 01.07.19 10:34 Сейчас в теме
КодЗакодированныгоСимвола = КодСимволаИсходнойСтроки + КодСимволаКлючаШифрования + СлучайнаяСоставляющая;

Я что то не понял у вас в сумме шифра случайное число. Получается текст зашифровать можно, а вот обратно нет. или только путем перебора случайной строки?
18. hide2000 03.01.20 17:15 Сейчас в теме
(17) Тоже обратил внимание на это. Но есть один нюанс, который все объясняет.
ГенераторСлучайныхЧисел
Описание:
Генератор случайных чисел инициализируется начальным числом из параметра.
Последовательность случайных чисел для одного и того же начального числа будет одинакова.

А начальное число всегда одно и тоже для определенного пароля.
19. Lemoi 11.09.20 21:16 Сейчас в теме
Алгоритм из публикации не учитывает тот факт что использование функции Символ для кодов, находящихся за пределами доступных Unicode двух байт (меньше 0 или больше 65535) возвращает пустую строку.

При шифровании данным алгоритмом очень длинной строки, либо при использовании в строке или ключе шифрования символов с кодами близкими к границе для Unicode, будет невозможно при расшифровке получить исходный текст.

Должно быть что-то вроде для ЗашифроватьСтроку:
КодЗакодированныгоСимвола = (КодСимволаИсходнойСтроки + КодСимволаКлючаШифрования + СлучайнаяСоставляющая) % 65536;


Для РасшифроватьСтроку:
КодСимволаИсходнойСтроки = (КодЗакодированныгоСимвола - КодСимволаКлючаШифрования — СлучайнаяСоставляющая) % 65536;
КодСимволаИсходнойСтроки = ?(КодСимволаИсходнойСтроки < 0, 65536 + КодСимволаИсходнойСтроки, КодСимволаИсходнойСтроки);
23. bocharovki 7 14.02.21 15:57 Сейчас в теме
(19) а не подскажете где почитать про конструкцию x % y ? Ваш вариант работает но вот хотелось бы понять что это.
20. Икар 23.11.20 18:18 Сейчас в теме
За что берёте стартмани? У вас в обработке нет никакого шифрования
21. NikitaXa 112 23.11.20 19:22 Сейчас в теме
22. Икар 17.12.20 10:38 Сейчас в теме
Если бы всё так хорошо работало бы, то 1с давно бы закрыла все свои конфигурации просто привязкой к ключу и никто бы не мог бы ничего сделать против этого.
Оставьте свое сообщение