Каталог решений - Шифрование текста и файлов с помощью 1С. Используется хеш-код SHA256, Без Capicom, Архиваторов и сторонних служб

Шифрование текста и файлов с помощью 1С. Используется хеш-код SHA256, Без Capicom, Архиваторов и сторонних служб

Шифрование текста и файлов с помощью 1С. Используется хеш-код SHA256, Без Capicom, Архиваторов и сторонних служб

В наличии

Данная статья описывает простейший собственный алгоритм шифрования средствами 1С. Без Capicom, Архиваторов и сторонних служб.
Данный метод работает на Платформе 8.3 и т.п.
09.07.19 Добавлена обработка шифрования файлов

Категория:

Описание

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

При сложном варианте расшифровать файл назад без пароля (от 8 символов) -станет практически невозможным.

Минусы данного метода — крайне низкая скорость работы.

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

 

Сначала мы получаем массивы из текста — которые необходимо зашифровать.

Далее из пароля делаем хеш код в формате SHA256 для надежности

Процедура КнопкаВыполнитьНажатие(Кнопка)
	массивТекста = РазложитьТекстВМассивПодстрок(СокрЛП(ИсходныйТест),символы.ПС);
	
	
	Хеш=Новый ХешированиеДанных(ХешФункция.SHA256);
	Хеш.Добавить(КодШифра); //Код Шифра - это наш пароль
	КлючШифра = Хеш.ХешСумма;
    //КлючШифра	 - это хеш от пароля в формате (SHA256) На котором работает Биткоин 
	МассивХеша = новый Массив;
	КлючШифра = СтрЗаменить(КлючШифра," ","");
	МассивХеша = РазложитьСтрокуВМассивзнаков(КлючШифра,МассивХеша);
	ЗашифрованныйТекст = ЗашифроватьТекст(массивТекста, МассивХеша);

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

 

Ниже приведен код текста шифрования:

//МассивСимволов - это текст переведенный в Массив
//КлючШифра - это хеш ключ переведенный массив
Функция ЗашифроватьТекст(МассивСимволов,КлючШифра)
	ЗашифрованнаяСтрока = "";
	ГСЧ = Новый ГенераторСлучайныхЧисел(1);

	ПозицияСимволаХэша = 0;
	ДлинаХэша = МассивХеша.количество();
	для каждого ном из МассивСимволов Цикл
		//Извлекаем номр шифруемого символа  UTF-8
		НомерСимвола = КодСимвола(ном);
		Если  ПозицияСимволаХэша >= ДлинаХэша-1 тогда
			ПозицияСимволаХэша = 0;
		КонецЕсли;
		//Позиция суммируемого хеша
		ПозицияСимволаХэша = ПозицияСимволаХэша+1;
		//Извлекаем номр символа хеша UTF-8
		СимволаХэша = КодСимвола(МассивХеша[ПозицияСимволаХэша]); 
		
		//Суммируем СуммыПозиций кодов 
		Код_Зашифрованный_символ =  НомерСимвола+СимволаХэша;
		Зашифрованный_символ = Символ(Код_Зашифрованный_символ);
		ЗашифрованнаяСтрока= ЗашифрованнаяСтрока+Зашифрованный_символ;
		
		//Усложним шифр добавляя тенического мусора при условие что КодСимвола хеша четный;
		Если Цел(СимволаХэша/2) = СимволаХэша/2 тогда
			
			СлучайноеЧисло = ГСЧ.СлучайноеЧисло(100, 1000); 
			ЗашифрованнаяСтрока= ЗашифрованнаяСтрока+Символ(СлучайноеЧисло);
		КонецЕсли;	
	КонецЦикла;
	возврат ЗашифрованнаяСтрока; 
	
	
КонецФункции	

Теперь сам код расшифровки 

Функция РасшифроватьТекст(МассивСимволов,КлючШифра)
	РасшифроватьТекст = "";
	ПозицияСимволаХэша = 0;
	ДлинаХэша = МассивХеша.количество();
	пропуск = ложь;
	для каждого ном из МассивСимволов Цикл
		
		Если пропуск тогда
			пропуск=ложь;
			продолжить;
		КонецЕсли;	

		
		НомерСимвола = КодСимвола(ном);
		Если  ПозицияСимволаХэша >= ДлинаХэша-1 тогда
			ПозицияСимволаХэша = 0;
		КонецЕсли;
		ПозицияСимволаХэша = ПозицияСимволаХэша+1;
		СимволаХэша = КодСимвола(МассивХеша[ПозицияСимволаХэша]); 

		Код_Зашифрованный_символ =  НомерСимвола-СимволаХэша;
		Зашифрованный_символ = Символ(Код_Зашифрованный_символ);
		
		
		РасшифроватьТекст= РасшифроватьТекст+Зашифрованный_символ;
		
		//Отсекаем мусор
		Если Цел(СимволаХэша/2) = СимволаХэша/2 тогда
			//пропускаем следующий символ;
			пропуск = истина;
		КонецЕсли;	

	КонецЦикла;
	возврат РасшифроватьТекст; 
	
	
КонецФункции	

Ну а также прочие функции по преобразованию текста в массив

Функция РазложитьТекстВМассивПодстрок(Знач Стр, Разделитель = "") Экспорт
	
	МассивСтрок = Новый Массив();
	ДлинаРазделителя = СтрДлина(Разделитель);
	Пока 1=1 Цикл
		Поз = Найти(Стр,Разделитель);
		Если Поз=0 Тогда
			МассивСтрок.Добавить(Стр);
			прервать;
		КонецЕсли;
		МассивСтрок.Добавить(Лев(Стр,Поз-1));
		Стр = Сред(Стр,Поз+ДлинаРазделителя);
	КонецЦикла;
	//Возврат МассивСтрок;
	МассивТекста = новый массив;
	для каждого ном из МассивСтрок Цикл
		Если  ном <> "" тогда
			МассивТекста = РазложитьСтрокуВМассивзнаков(ном,МассивТекста);
		КонецЕсли;
		МассивТекста.добавить(символы.ПС);
	КонецЦикла;	 
	
	возврат  МассивТекста;
	
КонецФункции



Функция РазложитьСтрокуВМассивзнаков(Знач Стр,МассивСтрок) Экспорт
	
	//МассивСтрок = Новый Массив();
	Длинастроки = СтрДлина(Стр);
	Поз=0;
	Пока 1=1 Цикл
		Поз = Поз+1;
		Если Длинастроки=0 Тогда
			Если Стр <> "" тогда
				МассивСтрок.Добавить(Лев(Стр,1));
			КонецЕсли;
			Возврат МассивСтрок;
		КонецЕсли;
		Если Стр <> "" тогда
			МассивСтрок.Добавить(Лев(Стр,1));
		КонецЕсли;
		
		Стр = Прав(Стр,Длинастроки-1);
		Длинастроки= Длинастроки-1;
	КонецЦикла;
	
	
КонецФункции 

Теперь мы получили инструмент к шифрации данных, тем не шифр имеет уязвимости в связи с повторяющимся ключом шифрации. Усложним ее перехешируя хеш-ключ при каждом повторении. Код с изменяющимся хешом-ключом представлен в сложной обработке (текст, файл). После чего получаем шифр стойкий к дешифровке. При пароле более 8 символов вероятность взлома шифра на сегодняшний день невозможна, так как необходим интеллектуальный анализ результата который потребует минимум 4-8 Гиг памяти платы(Asic устройства их не имеют.) и бесконечно много тактово-процессорных ресурсов для морфологического анализа полученного результата.

UPD 09.07.19 Добавлена обработка шифрования файлов

has been added to your cart:
Оформление заказа