Быстрый алгоритм шифрования AES ECB 128/192/256

03.09.21

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

Реализация существенно оптимизированного алгоритма симметричного шифрования AES (Advanced Encryption Standard) в режиме ECB (Electronic codebook) с различной длиной ключа 128/192/256 без использования внешних компонент, zip-файлов, обращения к диску или БД и без привязки к ОС.

Скачать исходный код

Наименование Файл Версия Размер
AES_EСB_v2.1
.epf 27,86Kb
38
.epf 2.1 27,86Kb 38 Скачать
AES_EСB_v2.0
.epf 27,34Kb
38
.epf 2.0 27,34Kb 38 Скачать

Предлагаемая обработка является существенно переработанной версией другой обработки, опубликованной здесь ранее:

//infostart.ru/public/1223640/

Её автор Никита Хацкевич проделал большую работу по переводу обработки с языка C на язык 1С. Однако у неё, на мой взгляд, осталось две проблемы:

1. Формат входных и выходных данных: строки в HEX-формате. Удобнее было бы иметь дело с типом ДвоичныеДанные.

2. Крайне низкая производительность. Когда я попытался использовать модуль "как есть" - быстро понял, что это не получится, т. к. слишком долго. Пришлось засучить рукава и внести свой вклад )

Обе проблемы удалось полностью решить, но от исходной обработки мало что осталось.

Первым делом был изменён тип входных данных - обработка сразу показала неплохой прирост в производительности. Но наиболее существенный прирост был получен за счёт предварительного расчёта всего, что можно было рассчитать. Эти данные были помещены в строку JSON, из которой при запуске полностью формируется готовая структура Const. Производительность выросла на порядок.

Следующей проблемой оказалась функция платформы "ПобитовоеИсключительноеИли" - она оказалась в топе по накладным расходам. Ок - делаем двумерный массив с посчитанными значениями. Но применить тот же приём со строкой JSON не удалось, так как загрузка этой строки стала занимать существенную часть времени. Тогда был применён другой приём - весь массив был записан побайтно в файл и затем загружен в макет. При старте вычислений из макета получается переменная типа ДвоичныеДанные, которая нарезается в массив буферов по 256 байт. Это отрабатывает быстро, но прирост в производительности от замены функции платформы составил всего 1,5-2 раза. Если вам требуется просто модуль, а не обработка, без каких-либо макетов - то стоит заменить обратно "XOR" на вызов типовой функции "ПобитовоеИсключительноеИли".

Ещё некоторое количество миллисекунд удалось выудить за счёт сокращения вложенности вызовов функций. Кое где в ущерб читаемости.

Заметка о самом алгоритме

Шифр блочный и поэтому если входные данные не кратны 16 байтам - "хвостик" забивается нулями. Это не очень хорошо с точки зрения криптостойкости, поэтому лучше, чтобы это были не нули, а случайные значения. Но в этом случае становится непонятна длина исходных данных. Помещать длину в начало или в конец - тоже не очень хорошо. Лучше передавать её отдельно и затем обрезать результат расшифровки до нужной длины.

Данная проблема в обработке не была отработана, так как не всем это нужно.

Тесты

Обработка тестировалась на платформе 1С:Предприятие 8.3 (8.3.16.1502).

Процедура тестирования исходной обработки:

&НаСервере
Процедура ТестСкоростиНаСервере()
	
	ОбработкаОбъект	= РеквизитФормыВЗначение("Объект");
	СчётчикПаролей	= 1;
	ИсходнаяСтрока	= "";
	
	Для ЧислоБлоков = 1 по 32 Цикл
		
		Данные			= ПолучитьДанные(ЧислоБлоков);
		ДанныеHEX		= ПолучитьHexСтрокуИзДвоичныхДанных(Данные);
		СреднееВремя	= 0;
		
		Для НомерИтерации = 1 по 10 Цикл
			
			Ключ256			= ПолучитьКлюч256(Формат(СчётчикПаролей, ""));
			Ключ256_HEX		= ПолучитьHexСтрокуИзДвоичныхДанных(Ключ256);
			СчётчикПаролей	= СчётчикПаролей + 1;
			
			Время1 = ТекущаяУниверсальнаяДатаВМиллисекундах(); // СТАРТ!
			
			РезультатHEX	= ОбработкаОбъект.Зашифровать(ДанныеHEX, Ключ256_HEX, 256);
			ИсходныеДанные	= ОбработкаОбъект.Расшифровать(РезультатHEX, Ключ256_HEX, 256);
			
			Время2 = ТекущаяУниверсальнаяДатаВМиллисекундах(); // СТОП!
			
			СреднееВремя	= СреднееВремя + Время2 - Время1;
			
		КонецЦикла;
		
		ТекстСообщения = СтрШаблон(
			"%1;%2"
			,Формат(ЧислоБлоков, "ЧН=; ЧГ=")
			,Формат(СреднееВремя / 10, "ЧРД=,; ЧН=; ЧГ=")
		);
		Сообщить(ТекстСообщения);
	КонецЦикла;
	
КонецПроцедуры

Результаты. Первый столбец - число блоков в сообщении. Второй столбец - среднее количество миллисекунд, необходимое для зашифровки и расшифровки этого сообщения 256-битным ключом за 10 итераций. Ключ на каждой итерации новый.

Число блоков млсек
1 1172,7
2 2095,9
3 3337,3
4 4462,9
5 5461
6 6124,4
7 7587,5
8 9798,7
9 10776,4
10 12567,2
11 13681,9
12 14596,7
13 15450,6
14 16352
15 17452,1
16 18694,3
17 20562,8

 

Процедура тестирования этой обработки:

&НаСервере
Процедура ТестСкоростиНаСервере()
	
	ОбработкаОбъект	= РеквизитФормыВЗначение("Объект");
	СчётчикПаролей	= 1;
	ИсходнаяСтрока	= "";
	
	Для ЧислоБлоков = 1 по 32 Цикл
		
		Данные			= ПолучитьДанные(ЧислоБлоков);
		СреднееВремя	= 0;
		
		Для НомерИтерации = 1 по 10 Цикл
			
			Ключ256			= ПолучитьКлюч256(Формат(СчётчикПаролей, ""));
			СчётчикПаролей	= СчётчикПаролей + 1;
			
			Время1 = ТекущаяУниверсальнаяДатаВМиллисекундах(); // СТАРТ!
			
			Результат		= ОбработкаОбъект.Зашифровать(Данные, Ключ256, 256);
			ИсходныеДанные	= ОбработкаОбъект.Расшифровать(Результат, Ключ256, 256);
			
			Время2 = ТекущаяУниверсальнаяДатаВМиллисекундах(); // СТОП!
			
			СреднееВремя	= СреднееВремя + Время2 - Время1;
			
		КонецЦикла;
		
		ТекстСообщения = СтрШаблон(
			"%1;%2"
			,Формат(ЧислоБлоков, "ЧН=; ЧГ=")
			,Формат(СреднееВремя / 10, "ЧРД=,; ЧН=; ЧГ=")
		);
		Сообщить(ТекстСообщения);
	КонецЦикла;
	
КонецПроцедуры

Результат. Столбцы те же.

Число блоков млсек
1 63,7
2 107,2
3 142,1
4 184,1
5 222,1
6 253,2
7 303,8
8 322,1
9 396,3
10 417,3
11 439,8
12 495,6
13 598,3
14 601,8
15 680,9
16 743,9
17 806,5
18 847,8
19 795,7
20 687
21 915,6
22 947,6
23 927,3
24 944,6
25 978,6
26 1019,1
27 1076,8
28 1095,7
29 1149,2
30 1251,6
31 1260,3
32 1221,4

 

17 блоков - 20562,8 млсек и 806,5. Итого: ускорение в 25,5 раз.

Оба результата в виде графика:

Важное дополнение (UPD)

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

Кто-то так не делает и подаёт на вход пароль как есть. В этом случае, если он меньше 32 байт, то функция шифровки должна заполнить его нулями. Если она больше 32 байт, то функция шифровки возьмёт только первые 32 байта, остальная часть пароля не будет никак использоваться.

Кроме того, при получении данных при шифровке, должно производиться заполнение буфера до конца нулями. Так как длина буфера кратна размеру блока (16 байт). Кто-то так тоже не делает. Тогда в блок попадает мусор, который был в памяти. В этом случае при расшифровке надо быть готовым, что этот мусор попадёт в буфер результата.

Для примера разберём вот этот онлайн-шифровальщик: https://encode-decode.com/aes-256-ecb-encrypt-online/

В нём некорректно работает заполнение входных данных. Если ввести текст длиной 15 байт, то результат имеет размер один блок. Если ввести текст длиной 16 байт, то результат имеет длину два блока, хотя должен быть один. В качестве заполнителя используются не нули, а случайные значения. Это неверно, так как при расшифровке (на другом клиенте) они добавятся к результату.

Данный сайт подаёт в функцию сам пароль, а не его хэш. Чтобы в этом убедиться нужно подать пароль длинный пароль и его усечённую версию, но чтобы оба были длиннее 32 байт. Результат шифровки будет одинаковый. Например такие:

password 32 bytes long .........
password 32 bytes long .........1234567

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

&НаСервере
Функция ПолучитьКлюч256(Пароль)
	Поток = Новый ПотокВПамяти();
	ЗаписьДанных = Новый ЗаписьДанных(Поток);
	
	ДлинаТекста = СтрДлина(Пароль);
	Если ДлинаТекста < 32 Тогда
		ЗаписьДанных.ЗаписатьСимволы(Пароль);
		Для НомерБайта = ДлинаТекста + 1 по 32 Цикл
			ЗаписьДанных.ЗаписатьБайт(0);
		КонецЦикла;
	Иначе
		ЗаписьДанных.ЗаписатьСимволы(Лев(Пароль, 32));
	КонецЕсли;
	
	ЗаписьДанных.Закрыть();
	Возврат Поток.ЗакрытьИПолучитьДвоичныеДанные();	
КонецФункции // ПолучитьКлюч

Попробуем шифровать на сайте и обработкой. Поскольку следующее случайное число мы не знаем (которое подаст данный конкретный сайт), то чтобы попробовать - подадим текст длинной в один блок (16 байт). А пароль подадим длиной 32 байта.

Входной текст = test string.....

Пароль = password 32 bytes long .........

Результат сайт = Z1kiP3YmXCMzifLooBZDOj364gptpei1FpyuX8beKOo= (base64)

или 67 59 22 3f 76 26 5c 23 33 89 f2 e8 a0 16 43 3a 3d fa e2 0a 6d a5 e8 b5 16 9c ae 5f c6 de 28 ea (HEX, два блока, во втором заполнитель, лишний)

Результат обработки = 67 59 22 3F 76 26 5C 23 33 89 F2 E8 A0 16 43 3A (один блок, как и должно быть).

Для идентичного результата надо использовать тот же заполнитель. При расшифровке данных с этого сайта, чтобы не получить ошибку платформы при передаче этих случайных значений с клиента на сервер, нужно изменить процедуру формы "РасшифроватьНаСервере", ноль заменить на значение заполнителя, например если он = 16, то так:

ПозицияХвоста = СтрНайти(ИсходныйТекстСХвостом, Символ(16)); // 0 -> 16

Вот пример скрипта на PHP, который работает точно так же, как и вся обработка, вместе с формой:

<?php

$string="test string";

// Функция "openssl_encrypt" - она по умолчанию не забивает блок нулями до конца. Поэтому делаем это сами.
// Помним, что нам нужна не строка, а бинарные данные.
if (strlen($string) % 16) {
    $string = str_pad($string, strlen($string) + 16 - strlen($string) % 16, "\0");
}

$method="AES-256-ECB";
$pass="pass123";

// Что делает функция "hash"?
// Вот по ней документация: https://www.php.net/manual/ru/function.hash.php
// Она отдаёт бинарные данные, только если указан третий параметр как Истина, по умолчанию он - Ложь.
// "При false выводит данные в шестнадцатеричной кодировке в нижнем регистре." - то есть возвращает СТРОКУ.
// Поэтому третий параметр должен быть = Истина.
$keyBin = hash('sha256', $pass, true);
echo("encrypt KEY ".bin2hex($keyBin)."\n");

// Смотрим, что делает openssl_encrypt: https://www.php.net/manual/ru/function.openssl-encrypt.php
// Шифрует данные с заданным шифром и ключом и возвращает необработанную строку, либо строку кодированную в base64.
// Видимо необработанная строка при опции OPENSSL_RAW_DATA и base64 - в остальных случаях.
// Давайте получим двоичные данные.
$encrypt=openssl_encrypt($string, $method, $keyBin, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING);
if (!$encrypt) {
echo("Что-то пошло не так...");
return;
}

// Выводим результат, преобразовав двоичные данные в HEX-строку:
$res = bin2hex($encrypt);
echo("encrypt HEX ".$res."\n");

?>

По поводу символов заполнителей - нигде не прописано, каким он должен быть. Нужна какая-то статистика, кто какое значение использует. Обычно это ноль. В этом случае, при конвертации в строку, всегда у всех отрабатывает правильно. Буду рад, если напишете в комментариях, какие варианты вы ещё встречали.

Версия 2.1

Учитывая всё вышеперечисленное, имеет смысл вынести заполнитель и способ подачи пароля в параметры. Что я и сделал в обновлённой версии. Используя данные параметры, можно добиться идентичных результатов с различными онлайн-шифровальщиками.

Спасибо за внимание.

 

 

aes aes-256 симметричное шифрование

См. также

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

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

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

1 стартмани

09.02.2023    2252    9    aximo    4    

2

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

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

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

2 стартмани

30.01.2023    1706    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    3046    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    3880    7    vit59    2    

6

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

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

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

10 стартмани

16.06.2022    10514    82    ZhokhovM    12    

41

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

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

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

2 стартмани

09.03.2022    5702    3    ge_ni    9    

2

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

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

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

1 стартмани

27.12.2021    4609    2    idm80    11    

9
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. malikov_pro 1293 30.10.20 13:14 Сейчас в теме
Плюс за развите темы криптографии на синтаксисе 1С.
Если можете опубликовать на github, то будет отлично, в идеале организовать библиотеку по аналогии с crypto-js в npm. Если нужны sm без проблем скачаю.

Сам для JWT использую HMAC и RSA256, первый в паблике есть, второй только в обработке на IS.
1div0; +1
10. 1div0 80 01.11.20 09:48 Сейчас в теме
(1) Спасибо за Ваш отзыв.
Пост появился именно для того, чтобы нажить неисчислимые богатства (и больше не работать, шутка). На самом деле периодически бывает интересно что-то скачать, а местной валюты нет.
В данном случае вообще интересно получилось, так как эта статья состоялась благодаря вот этой:
https://infostart.ru/public/952753/
Мой коллега скачал обработку для меня за свои sm.

По поводу JWT - у меня та же самая задача. Ради этого и занялся. HMAC и RSA256 - это очень хорошо, и есть готовый инструмент через МенеджерКриптографии. И не надо велосипед изобретать. Но мне как-то накладно показалось в дальнейшем обслуживании. Я имею ввиду возню с сертификатами. Поэтому я начал искать симметричный алгоритм с одним закрытым ключом.
Впрочем я об этом вчера написал статью, она ещё на модерации:
https://infostart.ru/public/1319502/
nsirotkin@mail.ru; +1
2. Pawlick 10 31.10.20 16:10 Сейчас в теме
Лично мне вот прям сейчас ничего шифровать не нужно, но я точно знаю, что когда понадобиться - цены не будет обработине.
Плюс однозначно.
+
3. d_neon 31.10.20 17:14 Сейчас в теме
В чем смысл переписывания алгоритма шифрования с плюсов на 1С? Прирост производительности мы вряд ли получим, придется много кода писать вручную. На плюсах сдвиг битов, XOR, сложение по модулю 2^32 и много чего еще, используемое в шифровании делается одной командой.
Или речь только про то, чтобы отказаться от внешних компонент?
+
9. 1div0 80 01.11.20 09:30 Сейчас в теме
(3) Вкратце ответ - да.
Я с Вами полностью согласен. Тратить своё время, вместо того, чтобы использовать готовое - крайне сомнительная вещь.
Однако, с другой стороны, я тут недавно переезжал большой системой с Windows на Linux, и внешние компоненты доставили, мягко говоря, хлопот.
И я пока вздрагиваю, когда читаю про внешние компоненты. Уверен это временно и скоро снова начну их применять.
Также согласен с тем, что чтобы обогнать плюсы, надо использовать не 1С, а, скажем CUDA (https://ru.wikipedia.org/wiki/CUDA). Но тут речь не про обогнать плюсы, а про приемлемое использование в 1С.
+
19. papami 55 01.11.20 17:09 Сейчас в теме
(9)
Также согласен с тем, что чтобы обогнать плюсы

А в CUDA код будет на чем написан?)
+
20. 1div0 80 02.11.20 05:09 Сейчас в теме
(19)
На специальном упрощённом диалекте языков C, C++, Фортран... Для успешной трансляции кода на этом языке в состав CUDA SDK входит собственный Си-компилятор командной строки nvcc компании Nvidia.


Нативный язык изначально не имеет возможностей, предоставляемых CUDA, поэтому я допустил их сравнение друг с другом.
+
4. ILM 240 31.10.20 18:41 Сейчас в теме
Любое изобретение и разработка может быть использовано в разных целях. Наличие быстрого алгоритма шифрования, реализованного на 1С позволит злоумышленникам написать обработки шифрования работающие внутри платформы. Предлагаю удалить эту обработку из открытого доступа сайта Инфостарт.
+
5. PerlAmutor 129 31.10.20 20:21 Сейчас в теме
(0) Спасибо за публикацию. Алгоритм Deflate/Inflate осилите? Я на днях почитал много про него, реализация на 1С должна быть крайне увлекательной несмотря на кажущуюся простоту и доступность информации.
+
6. 1div0 80 01.11.20 09:16 Сейчас в теме
(5) Пожалуйста:

ХЗ = Новый ХранилищеЗначения(ВашиДанные, Новый СжатиеДанных(9));
СтрокаBase64 = СериализаторXDTO.XMLСтрока(ХЗ);
ДвоичныеДанные = Base64Значение(СтрокаBase64);


Назад - всё то же самое в обратном порядке:
СтрокаBase64	= Base64Строка(ДвоичныеДанные);
ХЗ				= СериализаторXDTO.XMLЗначение(Тип("ХранилищеЗначения"), СтрокаBase64);
ВашиДанные		= ХЗ.Получить();


Отблагодарить можете скачав обработку.
+
8. PerlAmutor 129 01.11.20 09:19 Сейчас в теме
(6) Я не про это, а про реализацию LZ77 + деревьев Хаффмана, с каноническим построением деревьев, их хранение в потоке, их восстановление, использование при декодировании и т.д.
+
11. 1div0 80 01.11.20 09:59 Сейчас в теме
(8) Если я правильно понимаю, хранилище значения для сжатия как раз Deflate использует. Ну то есть это уже есть на уровне платформы. Я просто не вижу сценария, при котором потребуется своя самодельная обработка.
+
12. PerlAmutor 129 01.11.20 10:11 Сейчас в теме
(11) Те примеры, что вы привели относятся к разряду собственного формата входящих данных, т.к. само по себе ХранилищеЗначения сериалузется вместе с deflate потоком. Но если взять deflate данные из внешнего потока (без заголовков типа zip, gzip), то вы ничего не сможете раскодировать, т.к. внешние системы ничего не знают о типе данных ХранилищеЗначения и о том, что Deflate поток надо для нужд 1С предварять заголовком из ХЗ.

Ну вот пример в base64, закодированный Deflate:

PY3JDQJRDENbSQtcqW6G7YIQV25oOvhIBL5mbeG5IzwIcXEUx8/hxsSLtKaa­YGEONRTeX30wa0dPBjV0oVfryKA9xX7RieqDZdLB0YbxZ84unHTWMUxUtU4n­Y9gt65Nh5f9IxoZuy91L8mTxrLoaqeQH

Внутри закодирован текст в формате UTF-8.

Попробуйте распаковать методом, который вы предложили.
+
21. 1div0 80 02.11.20 05:49 Сейчас в теме
(12) Получается - да. Для связи с внешними системами нужно что-то мудрить. Потому что 1С сначала пишет данные в своём формате, а затем пакует.
P.S.: В примере вызывает подозрение два "<wbr>­".
+
23. SerVer1C 750 02.11.20 12:12 Сейчас в теме
(12)
PY3JDQJRDENbSQtcqW6G7YIQV25oOvhIBL5mbeG5IzwIcXEUx8/hxsSLtKaa­YGEONRTeX30wa0dPBjV0oVfryKA9xX7RieqDZdLB0YbxZ84unHTWMUxUtU4n­Y9gt65Nh5f9IxoZuy91L8mTxrLoaqeQH


Если 2 раза откинуть <wbr>, которые добавлены механизмом расцветки ИС, то получим:
Инженер по разработке и эксплуатации информационных систем на платформе 1С:Предприятие

см. мою обработку
+
24. PerlAmutor 129 02.11.20 18:36 Сейчас в теме
(23) Но это же тоже не то. Вы просто обрезаете/добавляете заголовки и используете zip. В Вашей публикации есть ремарка:

Как оказалось, на ИС уже есть похожие публикации, но там либо применяется внешний EXE-шник, либо внешняя компонента, либо работа с бинарными данными идет через европу.


Меня заинтересовал момент про "европу". Неужели кто-то на 1С уже реализовал работу с Deflate через работу с двоичными данными (алгоритмы LZ77 (через функцию кольцевого-хэша по примеру Рабина-Карпа, как в Zlib), кодирование Хаффмана)?
+
25. SerVer1C 750 02.11.20 20:52 Сейчас в теме
(24) Прямого алгоритма "в лоб" на 1с не встречал. Да и если таковой и появится, то он будет очень уныло работать, т. к. эска не предназначена для алгоритмических задач. А в кодировании Хаффмана там вообще используются биты...
+
7. 1div0 80 01.11.20 09:18 Сейчас в теме
(4) Это возможно. Только приведите пожалуйста конкретный сценарий, в котором использование именно этой (и никакой другой) обработки может навредить.
mrsmrv; +1
17. mrsmrv 126 01.11.20 16:02 Сейчас в теме
(4)А если это произойдёт во вторник - давайте запретим вторники.
"Предлагаю удалить эту обработку из открытого доступа сайта Инфостарт." спасибо, поржал.
DJ_Codebase; +1
22. SerVer1C 750 02.11.20 11:57 Сейчас в теме
(4) Срочно запретить во всех магазинах продажу ножей и топоров!!!
mrsmrv; +1
13. malikov_pro 1293 01.11.20 11:34 Сейчас в теме
"На самом деле периодически бывает интересно что-то скачать, а местной валюты нет." - поддержал скачиванием.

"По поводу JWT - у меня та же самая задача" - делаете серверную часть? В официальном каталоге https://jwt.io/ присутствует https://github.com/pintov/1c-jwt, если сможете расширить

"МенеджерКриптографии" - у меня не взлетело на PEM формате, RS256 использую для гугл, HS256 для пары сервисов.

"Впрочем я об этом вчера написал статью" - поддержал плюсом и скачиванием, не увидел как подготовить ключ для использования, Google выдает p12 или PEM обернутый в JSON, проблема распаковки описана в комментариях к статье https://infostart.ru/public/805071/
1div0; +1
16. 1div0 80 01.11.20 15:38 Сейчас в теме
(13)
не увидел как подготовить ключ для использования

Либо подаёте произвольные ДвоичныеДанные длиной 32 байта, либо можно SHA-256 получить от произвольной строки - пароля. В примере использован второй вариант.

По поводу остального - спасибо за информацию. Изучаю.
+
14. malikov_pro 1293 01.11.20 11:38 Сейчас в теме
(3) "Или речь только про то, чтобы отказаться от внешних компонент?" - именно так, к linux не факт что компоненты есть, при использовании в HTTP сервисе может просадку по производительности давать.
+
15. malikov_pro 1293 01.11.20 11:57 Сейчас в теме
(10) "Поэтому я начал искать симметричный алгоритм с одним закрытым ключом." - если про универсальность, то HS256 используется в https://infostart.ru/public/709325/ (https://github.com/vbondarevsky/Connector) как "AWS4-HMAC-SHA256 аутентификация".
По теме нативной реализации, в одном из API столкнулся с "PKCS 1", который для Java программистов "включил и работает", нас стороне 1С не смог запустить, решили изменением формата.
+
18. mrsmrv 126 01.11.20 16:07 Сейчас в теме
Качнул. йоу. Развиваем экосистему.
+
26. al.gerasimov 03.11.20 19:08 Сейчас в теме
А я Des-3Des написал для одного проекта и еще разбор ASN1. Надо кому-нибудь?
1div0; +1
27. 1div0 80 04.11.20 08:46 Сейчас в теме
(26)
и еще разбор ASN1

ASN.1 - мне надо. Есть одна идея.
+
33. al.gerasimov 12.11.20 03:36 Сейчас в теме
(27) похоже я не могу писать личные сообщения. Скинь сне свою почту в привате. Правда у меня код на англ. синтаксисе, пойдет?
+
34. 1div0 80 12.11.20 05:37 Сейчас в теме
(33) Английский или русский синтаксис - не важно.

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

a.a.klenov*ya.ru
+
49. obarc 18.03.22 19:37 Сейчас в теме
(26) Да, очень нужно, еще осталось? )
+
28. vsesam80 07.11.20 16:16 Сейчас в теме
Здравствуйте. Я параноик и социопат, а по этому задам вам тот же вопрос что и Никите по поводу его разработки - можно ли вашей обработкой шифровать реально серьезные вещи, пинкоды карт в базе, пароли от почты и пр.?
P.S. Обработку уже купил, она действительно быстрая. Кстати с Никитиной обработкой прикол был - на компе у меня медленней в шифровалось и дешифровалось чем на смартфоне под Андроидом.
+
30. mrsmrv 126 07.11.20 19:51 Сейчас в теме
(28) учитывая что AES активно и широко используется много кем и где, то думается что Да, можно использовать для перечисленных вами целей.
+
31. 1div0 80 10.11.20 05:30 Сейчас в теме
(28)
Я параноик и социопат, а по этому задам вам тот же вопрос что и Никите по поводу его разработки - можно ли вашей обработкой шифровать реально серьезные вещи, пинкоды карт в базе, пароли от почты и пр.?


Кратко - да.

Подробности:
Я гарантирую, что код модуля обработки в точности выполняет алгоритм AES. Это можно быстро проверить, зашифровав что-нибудь обработкой, а расшифровать сторонней программой. Можете вот на этом сайте попробовать - он поддерживает HEX-ключи. Либо выберите любой другой сайт.

По поводу надёжности самого алгоритма - вам стоит обратиться к его авторам. Но вообще считается, что это наиболее безопасный алгоритм шифрования среди симметричных алгоритмов. 26 ноября 2001 года AES был принят как федеральный стандарт (правительство США) обработки информации FIPS 197.

Также следует учесть, что данная обработка - это всего лишь инструмент. Многое зависит от того, как его применять. Например, в обработке (в форме) для наглядности используется пароль в виде фразы, который преобразуется в ключ путём получения хэша SHA-256. Это делает доступным перебор по словарю. Намного лучше, если ключ будет набором случайных байт (длинной 32 байта, разумеется).
vsesam80; +1
32. 1div0 80 10.11.20 05:37 Сейчас в теме
(28) И ещё - будете тестить, выбирайте формат "Zero" - значит без заголовков, просто данные (настройки получатся ECB, Zero, 256, и ключ).
+
50. vsesam80 11.12.22 19:30 Сейчас в теме
(32)Доброго времени. Вернулись к вашей разработке. решили потестить спустя два года. В общем с сайтом что вы указали не получается получить тот же результат при шифровке дешифровке почему то. Хотели показать потенциальному заказчику. не могли бы вы подсказать что не так? Версию я покупал 2.0
+
29. vsesam80 07.11.20 16:31 Сейчас в теме
Проверил сейчас на мобильном 1С, работает быстро, шифровал на 256 + много текста
akR00b; mrsmrv; +2
35. RomanVolgograd 12 16.02.21 21:50 Сейчас в теме
Однозначно плюс. Была бы возможность, поставил бы два плюса.

Для обмена с мобильной платформой просто шикарная вещь. Ибо возиться с сертификатами на адроиде это тот еще мазохизм. Кидать не зашифрованные пакеты по открытым каналам не айс. А так можно шифровать без всяких лишних проблем и багов.

Отлично оформлен программный код. Из названий процедур и функций понятно, что в них обрабатывается.

Даже недочетов то никаких не нашел. Ну разве уж совсем мелкие. Как то:

Дополнение исходного сообщение до нужной длины нулями. Если исходное сообщение заканчивается нулями, (а если шифруется не текст, а произвольные данные, то это вполне возможно) то при расшифровке конец исходного сообщения отрежется. К тому же, такой вариант приводит к атакам Оракула дополнения.

Но это уж совсем мелочи. А так - респект.
1div0; +1
36. 1div0 80 17.02.21 06:40 Сейчас в теме
(35) Спасибо за отзыв. Очень приятно, что оценили оформление.
На счёт нулей - тут уж пардоньте - по стандарту дополняется нулями. Я от себя ничего не добавлял/убавлял.
С другой стороны при желании несложно же дополнить чем то другим.
+
37. RomanVolgograd 12 17.02.21 11:02 Сейчас в теме
при желании несложно же дополнить чем то другим.

Абсолютно согласен. Собственно это была не претензия, это было мнение. Вообще есть разные стандарты дополнения, но это не суть важно. Работа проделана огромная, остальное поправить при необходимости не представляет особого труда. Еще раз респект.
+
38. DJ_Codebase 29.07.21 15:18 Сейчас в теме
Интересная обработка, однозначно плюс! А на чем основана? RijndaelManaged? просто интересно есть ли зависимости от ОС,.Net и т.п. Ограничения по запуску так сказать
+
39. DJ_Codebase 31.07.21 10:49 Сейчас в теме
(38) > без привязки к ОС
Невнимательно прочитал заголовок, именно это мне и нужно. Мое почтение автору, респект и уважуха!))
Разобрать такой алгоритм на косточки, реализовать его на 1С - вот это я понимаю, уровень!
+
40. vugluscr1991 12 16.08.21 17:50 Сейчас в теме
Прошу подсказать: в каких строчках кода создается вектор инициализации? Мне нужно иногда задавать его в явной форме.
+
41. vugluscr1991 12 18.08.21 15:07 Сейчас в теме
(40) Я так пока и не разобрался с алгоритмами, добился результата тем, что вызываю функцию Зашифровать() для блока двоичных данных в 16 байт с параметром KeySize = 128. Далее алгоритм такой: первые 16 байт сообщения солим (XORим) с вектором инициализации, шифруем, затем следующие 16 байт солим с результатом предыдущего шифрования и снова шифруем.
Результат удается расшифровать стандартными средствами в других приложениях.
+
44. 1div0 80 25.08.21 15:25 Сейчас в теме
(40) Скорее всего ни в каких. Для создания этой обработки была создана ещё одна, в которой и происходила предварительная инициализация. Далее результат инициализации сохранён в виде константы - фиксированный кэш. При запуске шифровки/расшифровки переменные взводятся в нужные значения сразу из этого кэша. Для большинства пользователей не требуется менять вектор инициализации - он во всех исходниках один и тот же. Лучше действительно "подсаливать" или иным образом воздействовать на входные данные.входные данные. Замену вектора же нужно производить и у отправителя и получателя. Поэтому у вас будет некая константа, которую можно использовать не для вектора, а для входных данных - например зашифровать этим вектором, а результат ещё раз зашифровать ключом. Типа такого..
+
45. vugluscr1991 12 26.08.21 11:57 Сейчас в теме
(44) Спасибо, я вот так и думал, что вектор инициализации в константы зашит. Однако я шифрую в 1С, а расшифровывают другие люди в других приложениях и вектор инициализации они мне ПРОДИКТОВАЛИ. Поэтому я искал способ управления вектором инициализации.
И в то же время одна из вариаций протокола такова, что вектор инициализации шифруется ключом и передается первым блоком в сообщений, дальше, получатель находит этот вектор и XORит второй блок, дальше третий блок XORит вторым и так далее.
+
42. VVi3ard 52 25.08.21 10:08 Сейчас в теме
Подскажите я же правильно понимаю что 32 блока это файл на 4Кб и он шифруется 1 секунду?

Т.е. шифровать 10-20 мб файл даже смысла нет пытаться?
+
43. 1div0 80 25.08.21 15:16 Сейчас в теме
32 блока - это 1 килобайт. 256 бит = 32 байта, 32 байта * 32 блока = 1024 байта.
10-20 МБ - за раз, да, будет шифровать несколько часов.
+
46. MAXXL 13 30.08.21 20:01 Сейчас в теме
Подскажите, а почему результат отличается от того что выдает например https://encode-decode.com/aes-256-ecb-encrypt-online/ ? исходные данные одинаковые
+
48. 1div0 80 03.09.21 11:07 Сейчас в теме
(46) Как я выяснил, некоторые сайты выполняют подготовку данных по-своему (по-сути - неправильно). Вот пример правильной шифровки текста на PHP:

<?php

$string="test string";

// Функция "openssl_encrypt" - она по умолчанию не забивает блок нулями до конца. Поэтому делаем это сами.
// Помним, что нам нужна не строка, а бинарные данные.
if (strlen($string) % 16) {
    $string = str_pad($string, strlen($string) + 16 - strlen($string) % 16, "\0");
}

$method="AES-256-ECB";
$pass="pass123";

// Что делает функция "hash"?
// Вот по ней документация: https://www.php.net/manual/ru/function.hash.php
// Она отдаёт бинарные данные, только если указан третий параметр как Истина, по умолчанию он - Ложь.
// "При false выводит данные в шестнадцатеричной кодировке в нижнем регистре." - то есть возвращает СТРОКУ.
// Поэтому третий параметр должен быть = Истина.
$keyBin = hash('sha256', $pass, true);
echo("encrypt KEY ".bin2hex($keyBin)."\n");

// Смотрим, что делает openssl_encrypt: https://www.php.net/manual/ru/function.openssl-encrypt.php
// Шифрует данные с заданным шифром и ключом и возвращает необработанную строку, либо строку кодированную в base64.
// Видимо необработанная строка при опции OPENSSL_RAW_DATA и base64 - в остальных случаях.
// Давайте получим двоичные данные.
$encrypt=openssl_encrypt($string, $method, $keyBin, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING);
if (!$encrypt) {
echo("Что-то пошло не так...");
return;
}

// Выводим результат, преобразовав двоичные данные в HEX-строку:
$res = bin2hex($encrypt);
echo("encrypt HEX ".$res."\n");

?>
Показать


Результат будет таким:
encrypt KEY 9B8769A4A742959A2D0298C36FB70623F2DFACDA8436237DF08D8DFD5B37­374C
encrypt HEX A16B6E242BC2F8D5E1ECA6B3161B108D


..что точно соответствует результату работы обработки.
+
47. 1div0 80 31.08.21 04:24 Сейчас в теме
Значит входные данные не одинаковые. Что является входной строкой на этом сайте? Вы пользовались формой обработки или непосредственно процедурами модуля? В общем, скорее всего, вам нужно проверить форматы входных данных: на сайте это строки, в обработке - бинарные данные.
Если с формы пробовали - то там шифруется не самим паролем, а его sha1, если я правильно помню. Нужно посмотреть, что с паролем сайт делает и сделать в обработке так же. Тогда результат совпадёт.
+
Оставьте свое сообщение