XOR в 1С: защита данных, программирование и практическое применение шифрования и дешифрования

09.04.25

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

Статья посвящена практическому применению XOR-шифрования в среде 1С:Предприятие. Рассматривается теоретическая основа операции XOR, её особенности как метода шифрования, а также преимущества и недостатки в контексте защиты данных. Подробно описываются методы реализации XOR-шифрования и дешифрования на языке 1С, включая примеры кода и практические сценарии использования, такие как шифрование паролей, защита конфиденциальных данных в файлах и передача зашифрованной информации между системами. Обсуждаются аспекты безопасности, выбор ключей, а также интеграция с другими механизмами защиты данных в 1С. Статья ориентирована на разработчиков 1С, стремящихся повысить уровень защиты информации в своих решениях.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Применение Шифрования и Дешифрования
.epf 6,97Kb
0
0 Скачать (1 SM) Купить за 1 850 руб.

Введение в шифратор/дешифратор XOR

Шифр XOR, или шифр побитовой инверсии, представляет собой один из самых простых и элегантных симметричных шифров. Его простота заключается в использовании единственной операции – исключающего ИЛИ (XOR). Эта логическая операция сравнивает два бита: если биты равны, результат – 0; если биты разные, результат – 1. В криптографии XOR используется для шифрования данных путем побитового сложения открытого текста с секретным ключом. Результат этой операции – шифрованный текст. Замечательной особенностью XOR является его инволютивность: повторное применение XOR с тем же ключом к зашифрованному тексту восстанавливает исходный открытый текст. Это означает, что один и тот же алгоритм может служить как для шифрования, так и для дешифрования, что значительно упрощает его реализацию. Отсутствие сложных математических вычислений делает XOR невероятно эффективным с точки зрения вычислительных ресурсов, особенно при обработке больших объемов данных. Его легко понять и реализовать даже на уровне ассемблера, что делает его привлекательным выбором для различных систем, где важна скорость и минимальное потребление ресурсов. Однако, несмотря на свою эффективность, XOR сам по себе не является надежным шифром для защиты конфиденциальной информации в критически важных приложениях, если ключ используется неоднократно или если он слишком короткий. Поэтому его часто применяют в комбинации с другими, более сложными алгоритмами, обеспечивая дополнительный уровень безопасности. Перейдем к более подробному рассмотрению его истории и эволюции.

История и эволюция шифра XOR

История применения побитовой операции XOR в криптографии уходит корнями в ранние дни развития вычислительной техники. Хотя точная дата первого использования XOR для шифрования неизвестна, его простота и эффективность быстро привлекли внимание криптографов. В отличие от более сложных шифров, требующих значительных вычислительных мощностей, XOR был идеально адаптирован к возможностям первых компьютеров. Его использование в различных системах шифрования росло экспоненциально вместе с развитием вычислительной техники. В ранних системах связи и хранения данных XOR часто применялся как простой способ защиты информации от несанкционированного доступа. Однако, понимание уязвимостей XOR привело к его переосмыслению. Использование простого повторяющегося ключа делало шифр легко взламываемым с помощью методов криптоанализа, основанных на статистическом анализе шифрованного текста. Этот недостаток привел к разработке более сложных схем, использующих XOR в комбинации с другими криптографическими техниками, такими как генерация псевдослучайных чисел (ПСПЧ) для создания динамических ключей. Современные приложения часто используют XOR в качестве элемента более крупных и robust криптографических алгоритмов, таких как потоковые шифры, где ключ меняется на каждом шаге шифрования, делая криптоанализ значительно сложнее. Рассмотрим, где именно применяется XOR в современных системах.

Применение шифра XOR в современных системах

Простота и высокая скорость работы шифра XOR сделали его незаменимым инструментом в различных областях информационных технологий. Один из наиболее распространенных случаев применения – это защита данных в памяти или на диске. Часто XOR используется для хранения паролей в хешированном виде, повышая уровень безопасности и предотвращая компрометацию данных при взломе системы. Это позволяет хранить пароли в более защищенном виде, чем в виде простого текста. Однако, важно отметить, что XOR-хеширование не должно рассматриваться как единственное средство защиты паролей; лучше использовать более robust хеширующие алгоритмы, такие как bcrypt или Argon2. Другая область применения – в сетях передачи данных. XOR может использоваться как часть более сложных протоколов шифрования, обеспечивая дополнительный уровень безопасности при передаче информации. Например, XOR может быть использован для шифрования отдельных пакетов данных в рамках более широкой системы шифрования. В защите программного обеспечения XOR также играет свою роль – он может быть использован для защиты отдельных частей кода от reverse engineering, или для скрытия конфиденциальных данных внутри исполняемого файла. В некоторых случаях XOR используется в системах управления доступом и аутентификации, обеспечивая дополнительную защиту при проверке подлинности пользователя. Все это показывает, насколько универсален и полезен данный шифр. Перейдем к рассмотрению других методов шифрования.

Альтернативные шифры и применение XOR в 1С

Хотя XOR является простым и эффективным шифром, он не подходит для защиты критически важной информации в самостоятельном виде. Для обеспечения высокого уровня безопасности используются более сложные алгоритмы. Симметричные шифры, такие как AES (Advanced Encryption Standard) и ChaCha20, основаны на более сложных математических преобразованиях и обладают значительно более высокой криптостойкостью, чем XOR. Асимметричные шифры, например, RSA (Rivest–Shamir–Adleman), используют пары ключей – открытый и закрытый – что обеспечивает более гибкий и безопасный обмен ключами. Криптографические хеш-функции, такие как SHA-256 и SHA-3, генерируют уникальные дайджесты данных, которые могут использоваться для проверки целостности информации. Каждый из этих алгоритмов имеет свои преимущества и недостатки, выбор зависит от конкретных требований к безопасности и производительности. В контексте платформы "1С:Предприятие", непосредственное использование простого XOR для шифрования данных не рекомендуется из-за его низкой криптостойкости. Однако, XOR может быть полезен как вспомогательный инструмент в рамках более сложной системы шифрования, реализованной с использованием криптографических библиотек или внешних компонентов. Например, можно использовать XOR для дополнительного перемешивания данных, уже зашифрованных более надежным алгоритмом. Более того, встроенный язык "1С:Предприятия" предоставляет достаточные возможности для реализации более robust алгоритмов шифрования, что позволяет разработчикам создавать защищенные приложения, соответствующие современным стандартам безопасности. Правильное использование криптографии в "1С" требует понимания всех тонкостей и нюансов, чтобы обеспечить максимальную защиту данных и предотвратить возможные уязвимости. Поэтому к выбору алгоритмов шифрования следует подходить тщательно, учитывая все возможные угрозы.

Реализация средствами 1С

Рассмотрим пример реализации простого, но эффективного алгоритма шифрования, который может быть интегрирован в платформу "1С:Предприятие". Данный алгоритм основан на операции XOR (исключающее ИЛИ), что делает его простым в реализации и достаточно быстрым для обработки больших объемов текста.

Основу алгоритма составляют две серверные процедуры и две серверные функции. Первая процедура, предназначенная для шифрования, называется условно "ЗашифроватьНаСервере". Она принимает два аргумента: исходный текст, который необходимо зашифровать, и ключ шифрования, представляющий собой строку. Внутри процедуры вызывается функция "ШифроватьXOR", которая выполняет непосредственно операцию шифрования. Результат шифрования, зашифрованный текст, сохраняется в реквизите объекта.

&НаСервере
Процедура ЗашифроватьНаСервере(ТекстДляШифрования, Ключ)
    
    ЗашифрованныйТекст = ШифроватьXOR(ТекстДляШифрования, Ключ);
    Объект.ЗашифрованныйТекст = ЗашифрованныйТекст;

КонецПроцедуры

Функция "ШифроватьXOR" является ключевым элементом алгоритма. Она также принимает два аргумента: текст для шифрования и ключ. Внутри функции происходит итерация по каждому символу исходного текста. Для каждого символа вычисляется позиция соответствующего символа ключа, используя операцию деления по модулю. Это позволяет повторно использовать короткий ключ для шифрования длинного текста. Затем, для текущего символа текста и символа ключа, извлекаются коды символов. Коды символов складываются, и полученный результат преобразуется обратно в символ. Этот зашифрованный символ добавляется к результату.

&НаСервере
Функция ШифроватьXOR(Текст, Ключ)
	
	Результат = "";
	ДлинаТекста = СтрДлина(Текст);
	ДлинаКлюча = СтрДлина(Ключ);
	
	Для i = 1 По ДлинаТекста Цикл
		ПозицияКлюча = (i - 1) % ДлинаКлюча + 1;
		СимволТекста = Сред(Текст, i, 1);
		СимволКлюча = Сред(Ключ, ПозицияКлюча, 1);
		
		КодСимволаТекста = КодСимвола(СимволТекста);
		КодСимволаКлюча = КодСимвола(СимволКлюча);
		
		ЗашифрованныйКод = КодСимволаТекста + КодСимволаКлюча;
		ЗашифрованныйСимвол = Символ(ЗашифрованныйКод);
		
		Результат = Результат + ЗашифрованныйСимвол;
		
	КонецЦикла;
	
	Возврат Результат;

КонецФункции

Для расшифровки используется функция "РасшифроватьXOR", которая зеркально отражает процесс шифрования. Она принимает зашифрованный текст и ключ в качестве входных данных. Логика функции аналогична "ШифроватьXOR": происходит итерация по каждому символу зашифрованного текста, вычисляется позиция символа ключа, извлекаются коды символов, но на этот раз из кода символа текста вычитается код символа ключа. Функция учитывает случаи, когда код символа текста меньше кода символа ключа, и в этом случае, результат принимается равным нулю. Полученный результат преобразуется обратно в символ и добавляется к результату расшифровки.

&НаСервере
Функция РасшифроватьXOR(Текст, Ключ)
	
	Результат = "";
	ДлинаТекста = СтрДлина(Текст);
	ДлинаКлюча = СтрДлина(Ключ);
	
	Для i = 1 По ДлинаТекста Цикл
		ПозицияКлюча = (i - 1) % ДлинаКлюча + 1;
		СимволТекста = Сред(Текст, i, 1);
		СимволКлюча = Сред(Ключ, ПозицияКлюча, 1);
		
		КодСимволаТекста = КодСимвола(СимволТекста);
		КодСимволаКлюча = КодСимвола(СимволКлюча);
		
		Если КодСимволаТекста >= КодСимволаКлюча Тогда
			РасшифрованныйКод = КодСимволаТекста - КодСимволаКлюча;
		Иначе
			РасшифрованныйКод = 0; // Обработка случая, когда КодСимволаТекста < КодСимволаКлюча
		КонецЕсли;
		
		РасшифрованныйСимвол = Символ(РасшифрованныйКод);
		Результат = Результат + РасшифрованныйСимвол;
	КонецЦикла;
	
	Возврат Результат;

КонецФункции

Для расшифровки текста на форме вызывается функция "РасшифроватьТекстНаСервере", которая принимает зашифрованный текст и ключ, а затем, вызывает функцию "РасшифроватьXOR", возвращая расшифрованный результат.

&НаСервере
Функция РасшифроватьТекстНаСервере(Текст, Ключ) Экспорт

    РасшифрованныйТекст = РасшифроватьXOR(Текст, Ключ);
    Возврат РасшифрованныйТекст;

КонецФункции

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

&НаКлиенте
Процедура Зашифровать(Команда)

    ЗашифроватьНаСервере(Объект.ИсходныйТекст, Объект.Пароль);

КонецПроцедуры
&НаКлиенте
Процедура Расшифровать(Команда)

    Объект.РасшифрованныйТекст = РасшифроватьТекстНаСервере(Объект.ЗашифрованныйТекст, Объект.Пароль);

КонецПроцедуры

Таким образом, реализован простой и эффективный алгоритм шифрования, который обеспечивает базовую защиту данных. Важно отметить, что данный алгоритм не предназначен для использования в системах с высокими требованиями к безопасности. XOR-шифрование легко взламывается, особенно при использовании коротких ключей. Тем не менее, для простых задач, таких как защита конфиденциальной информации в рамках системы оптимизации производственных заказов, данный алгоритм может быть вполне приемлемым. Более сложные алгоритмы шифрования, такие как AES или DES, требуют интеграции внешних библиотек или использования криптографических сервисов, что может усложнить разработку и внедрение. Однако, выбор конкретного алгоритма шифрования должен основываться на оценке рисков и требований к безопасности в каждой конкретной ситуации.

Прикладываю рабочую обработку к статье для скачивания, так же можете воспользоваться кодом из статьи - он рабочий, код обработки открыт.

Проверено на следующих конфигурациях и релизах:

  • 1С:ERP Управление предприятием 2, релизы 2.5.13.82

XOR шифрование дешифрование защита данных криптография безопасность алгоритм ключ XOR-операция шифрование данных дешифрование данных пароли конфиденциальность файлы передача данных интеграция безопасность 1С программирование примеры кода

См. также

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

Обработки, в которых реализованы алгоритмы шифрования ГОСТ 34.10-2012, RSA-1024, AES-256-GCM, XChacha20-poly1305. Реализация нативно на чистом 1С без COM-объектов и внешних компонент.

1 стартмани

17.03.2025    465    5    alexyur    8    

4

Защита ПО и шифрование Программист Платформа 1С v8.3 1С:Управление торговлей 11 Абонемент ($m)

Небольшой пример - "лайф-хак" по установке собственного пароля на отчет или обработку, не втягивая в это RLS.

3 стартмани

06.03.2025    1885    2    aximo    23    

14

Защита ПО и шифрование Программист Платформа 1С v8.3 Бесплатно (free)

В статье приведен простой способ защиты кода внешней обработки от несанкционированного доступа (если это необходимо).

30.12.2024    5854    artemusII    17    

9

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

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

1 стартмани

09.02.2023    3258    14    aximo    5    

2

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

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

2 стартмани

30.01.2023    2445    2    olevlasam    3    

3

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

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

1 стартмани

04.12.2022    3930    18    keyn5565`    0    

15

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

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

2 стартмани

31.08.2022    4935    9    vit59    2    

6
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. akR00b 24 09.04.25 10:40 Сейчас в теме
Спасибо, познавательно.
2. Diversus 2334 09.04.25 10:46 Сейчас в теме
Наверное, использовать поток будет получше

// Шифрует переданную строку ключом по XOR.
//
// Параметры:
//	Строка - Строка - исходная строка, которая будет зашифрована.
//	Ключ - Строка - строка, которую будем использовать в качестве ключа для шифрования.
//
// Возвращаемое значение:
//	Строка - зашифрованная строка в формате BASE64.
//
Функция ШифрованиеСтрокиXOR(Знач Строка, Знач Ключ)
		
	Поток 			= Новый ПотокВПамяти;
	ЗаписьДанных 	= Новый ЗаписьДанных(Поток);
	
	БуферСтроки 	= ПолучитьБуферДвоичныхДанныхИзСтроки(Строка);
	БуферКлюча 		= ПолучитьБуферДвоичныхДанныхИзСтроки(Ключ);          
	
	СчетчикКлюча 	= 0;
    ДлинаКлюча 		= СтрДлина(Ключ);
	
	Для Каждого Число1 Из БуферСтроки Цикл
		Число2 		= БуферКлюча.Получить(СчетчикКлюча);
		ЗаписьДанных.ЗаписатьБайт(ПобитовоеИсключительноеИли(Число1, Число2));
		СчетчикКлюча = (СчетчикКлюча + 1) % ДлинаКлюча;
	КонецЦикла;
	ЗаписьДанных.Закрыть();
	ДД 			= Поток.ЗакрытьИПолучитьДвоичныеДанные();
	
	Результат 	= Base64Строка(ДД);
	Результат 	= СтрЗаменить(Результат, Символы.ПС, "");
	Результат 	= СтрЗаменить(Результат, Символы.ВК, "");
	Возврат Результат;
	
КонецФункции

// Расшифровывает переданную строку ключом по XOR.
//
// Параметры:
//	СтрокаБ64 - Строка - исходная строка в BASE64, которая будет дешифрована.
//	Ключ - Строка - строка, которую будем использовать в качестве ключа для дешифрования.
//
// Возвращаемое значение:
//	Строка - расшифрованная строка.
//
Функция РасшифровкаСтрокиXOR(Знач СтрокаБ64, Знач Ключ)
	
	Поток 			= Новый ПотокВПамяти;
	ЗаписьДанных 	= Новый ЗаписьДанных(Поток);
	
	БуферСтроки 	= ПолучитьБуферДвоичныхДанныхИзBase64Строки(СтрокаБ64);
	БуферКлюча 		= ПолучитьБуферДвоичныхДанныхИзСтроки(Ключ);
	
	СчетчикКлюча 	= 0;
    ДлинаКлюча 		= СтрДлина(Ключ);
	
	Для Каждого Число1 Из БуферСтроки Цикл
		Число2 		= БуферКлюча.Получить(СчетчикКлюча);
		ЗаписьДанных.ЗаписатьБайт(ПобитовоеИсключительноеИли(Число1, Число2));
		СчетчикКлюча = (СчетчикКлюча + 1) % ДлинаКлюча;
	КонецЦикла;
	ЗаписьДанных.Закрыть();
	ДД 			= Поток.ЗакрытьИПолучитьДвоичныеДанные();
	Попытка
		Результат 	= ПолучитьСтрокуИзДвоичныхДанных(ДД);
	Исключение
	    Результат 	= "";
	КонецПопытки;
	
	Возврат Результат;  
	
КонецФункции
Показать
Anqben; bulpi; +2 Ответить
3. user1195929 110 09.04.25 12:36 Сейчас в теме
(2) спасибо! Ваш пример хорош. Для понимания метода в статье упрощенный вариант, его можно адаптировать под свои нужды.
4. user1195929 110 10.04.25 13:03 Сейчас в теме
(2) Пересмотрел ваш пример иначе. Это усложнение понимания статьи, обычному начинающему программисту " Строка - зашифрованная строка в формате BASE64" придется разобраться с вашим BASE64, и не каждый имеет понятие для чего BASE64 и как он работает и работает ли в его конфигурации 1с. Моё почтение, проделанной Вами работы, но читателю должен быть понятен сам метод, а о вариациях применения он должен сам познать и применить в своих реализациях.
5. Diversus 2334 10.04.25 14:05 Сейчас в теме
У вас в функциях проблема со строками может быть. Т.е. Xor может возвращать непечатные символы, или символы которые не видно. Поэтому и нужно преобразовать в base64
Оставьте свое сообщение