Практика применения XOR. XOR кодирование строковых полей с помощью ключа. Побитовые операции

06.11.20

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

В данной статье я расскажу о битовой операции XOR (исключающее ИЛИ) и приведу наиболее интересные примеры ее применения на 1С методами платформы. Обмен значений переменных без использования дополнительной переменной.

Файлы

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

Наименование Скачано Купить файл
Практика применения XOR. XOR кодирование строковых полей с помощью ключа. Побитовые операции.:
.epf 10,54Kb
18 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

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

Разработка и тестирование было на платформе 1С 8.3.16. Подходит под любую конфигурацию. 

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

Они представлены в виде обработки с простым интерфейсом. 

За основание взято шифрования на JAVA

public static byte[] encode(String pText, String pKey) { byte[] txt = pText.getBytes(); byte[] key = pKey.getBytes(); byte[] res = new byte[pText.length()]; for (int i = 0; i < txt.length; i++) { res[i] = (byte) (txt[i] ^ key[i % key.length]); } return res; }

///////////////////////////////////////////

Аналог функции на 1С

&НаСервере
Функция xor_encode(pText,pKey)
    
    СистемнаяИнформация = Новый СистемнаяИнформация;
    Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения,"8.3.9.0") > 0 Тогда 
        _txt     = getBytes(pText);
        _key     = getBytes(pKey);
    Иначе     
        _txt      = Преобразовать64(Base64Строка(ПолучитьДвоичныеДанныеИзСтроки(pText)));
        _key      = Преобразовать64(Base64Строка(ПолучитьДвоичныеДанныеИзСтроки(pKey)));
    КонецЕсли;
    
        _res      = Новый Массив(); //СтрДлина(pText));
    
    Для i = 0 по _txt.Count() - 1 Цикл 
        _res.add(BitwiseXor(_txt[i] ,  _key[(i % _key.Count())]));
    КонецЦикла;    
    
    //Строка64ИзБайтов = ПолучитьСтрокуИзДвоичныхДанных(Base64Значение(Преобразовать64(,_res)),"windows-1252");
    Строка64ИзБайтов = getStringBase64(_res);

    Возврат Строка64ИзБайтов;
    
КонецФункции

дешифрование на java

public static String decode(byte[] pText, String pKey) { byte[] res = new byte[pText.length]; byte[] key = pKey.getBytes(); for (int i = 0; i < pText.length; i++) { res[i] = (byte) (pText[i] ^ key[i % key.length]); } return new String(res); }

Аналог на 1С

&НаСервере
Функция xor_decode(pText,pKey)
    
    СистемнаяИнформация = Новый СистемнаяИнформация;
    Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения,"8.3.9.0") > 0 Тогда 
        _key     = getBytes(pKey);
    Иначе     
        _key      = Преобразовать64(Base64Строка(ПолучитьДвоичныеДанныеИзСтроки(pKey)));
    КонецЕсли;

        _res      = Новый Массив(pText.Count());
    
    Для i = 0 по pText.Count() - 1 Цикл 
        _res[i] = BitwiseXor(pText[i] ,  _key[(i % _key.Count())]);
    КонецЦикла;    
    
    //Строка64ИзБайтов = ПолучитьСтрокуИзДвоичныхДанных(Base64Значение(Преобразовать64(,_res)));
    Строка64ИзБайтов = getString(_res);
    
    Возврат Строка64ИзБайтов;
    
КонецФункции

Все дополнительные процедуры в обработке. Работает на 8.3.15.

&НаСервере
Функция getBytes(pText)
    
    BytesArray = New Array();
    
    BinaryStrem = GetBinaryDataFromString(pText).OpenStreamForRead();
    
    DataReader = New DataReader(BinaryStrem, TextEncoding.UTF8, ByteOrder.BigEndian);

    DataBuffer = DataReader.ReadIntoBinaryDataBuffer();
    
    //пройдемся по каждому байту буфера
    For Each Byte in DataBuffer Do
         BytesArray.Add(Byte);
    EndDo;

    Return BytesArray;
    
КонецФункции

&НаСервере
Функция getBytesFromStr64(base64)
    
    bindata = Base64Значение(base64);
    HexСтрока = ПолучитьHexСтрокуИзДвоичныхДанных(bindata);
    
    BinaryStrem = ПолучитьДвоичныеДанныеИзHexСтроки(HexСтрока).ОткрытьПотокДляЧтения();
    
    BytesArray = New Array();
        
    DataReader = New DataReader(BinaryStrem, TextEncoding.UTF8, ByteOrder.BigEndian);
    
    DataBuffer = DataReader.ReadIntoBinaryDataBuffer();
    
    //пройдемся по каждому байту буфера
    For Each Byte in DataBuffer Do
        BytesArray.Add(Byte);
    EndDo;
    
    Return BytesArray;
    
КонецФункции

&НаСервере
Функция getString(BytesArray)
    
    DataBuffer = Новый БуферДвоичныхДанных(BytesArray.Количество(),ByteOrder.BigEndian);
    For Byte = 0 по BytesArray.Количество() -1 Do
         DataBuffer.Установить(Byte,BytesArray[Byte]);
     EndDo;
     
    Return ПолучитьСтрокуИзБуфераДвоичныхДанных(DataBuffer,TextEncoding.UTF8);
    
КонецФункции

&НаСервере
Функция getStringBase64(BytesArray)
    
    DataBuffer = Новый БуферДвоичныхДанных(BytesArray.Количество(),ByteOrder.BigEndian);
    For Byte = 0 по BytesArray.Количество() -1 Do
         DataBuffer.Установить(Byte,BytesArray[Byte]);
     EndDo;
     
    Return Base64Строка(ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(DataBuffer));
    
КонецФункции


 

Есть аналоги процедуры для 8.2.

Вступайте в нашу телеграмм-группу Инфостарт

Xor Кодирование Хеш Хеширование Обработка Побайтовые операции

См. также

Защита ПО и шифрование Программист 1С 8.3 1С:Розница 2 Абонемент ($m)

Учебная обработка показывает, как 1С шифрует номер карты публичным ключом RSA перед отправкой в платёжный шлюз и подписывает тело запроса - на чистом встроенном языке, без COM, .NET и внешних компонент. Почти все реализации RSA в 1С зовут .NET через COM, а он требует регистрации сборки и не работает на Linux и в тонком клиенте. Здесь RSA написан целиком на BSL: длинная арифметика, деление Кнута, возведение в степень по модулю. Корректность сверена с эталоном на больших числах байт в байт. Демо-ключ 256 бит, всё локально, одной кнопкой. Код открыт.

1 стартмани

07.08.2026    294    0    nedomolkov.ivan    1    

1

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

Платёжный шлюз принимает номер карты только зашифрованным по RSA, а почти все реализации RSA в 1С зовут .NET через COM - и это молча ломается на Linux-сервере, в тонком клиенте и на голой Windows без regasm. Разбираю, как написать RSA целиком на встроенном языке: как хранить большие числа лимбами по основанию миллион, откуда берётся деление Кнута и square-and-multiply, почему первая версия считала 25 секунд и как это ускорилось в 8 раз. С проверкой байт в байт против внешнего эталона на больших числах.

07.08.2026    350    nedomolkov.ivan    1    

2

Защита ПО и шифрование Программист 1С:Предприятие 8 Бесплатно (free)

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

19.02.2026    3164    1c-izh    9    

9

Защита ПО и шифрование Программист Бухгалтер Пользователь 1С:Предприятие 8 Россия Абонемент ($m)

Обработка для подписи с помощью сертификата (ЭЦП) произвольных файлов, средствами платформы 1С.

5 стартмани

19.06.2025    2204    3    krundel    2    

0

Защита ПО и шифрование 1С:Предприятие 8 Абонемент ($m)

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

1 стартмани

03.06.2025    2505    user1195929    13    

4

Защита ПО и шифрование Программист 1С:Предприятие 8 Абонемент ($m)

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

1 стартмани

09.04.2025    4094    user1195929    6    

4

Защита ПО и шифрование Программист 1С:Предприятие 8 Россия Абонемент ($m)

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

1 стартмани

17.03.2025    5354    55    alexyur    10    

7

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

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

3 стартмани

06.03.2025    3826    7    aximo    23    

13
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ab_initio 96 06.11.20 16:04 Сейчас в теме
Я, чесслово, слезу пустил...
Такой привет из загробной жизни. Не ужели ксорки не умерли вместе с Z80?

http://zxpress.ru/book_articles.php?id=1016
http://zxpress.ru/article.php?id=6266
Rafaraf; kv.lv; +2 Ответить
2. kv.lv 10 08.11.20 01:36 Сейчас в теме
На просторах интернета не нашел нормального ришения. все з внешними компонентами и другими кастилями.
пришлось самому писать((

и да... кроски в платформе 1с появились относительно недавно((
3. artmicro 16.09.21 15:57 Сейчас в теме
При открытии ошибка, что отсутствует функция BitwiseXor
4. kv.lv 10 09.11.21 16:08 Сейчас в теме
нужно на платформе выше 8.3.15
5. 1cembreg 25 22.11.23 09:36 Сейчас в теме
(4) А зачем тогда сравнение с 8.3.9.0 xor_decode?

Ищу решение как раз для версии в режиме совместимости с 8.3.7, у вас написано что есть вариант для 8.2, можете приложить?
Для отправки сообщения требуется регистрация/авторизация