0. ogidni 124 26.06.19 11:30 Сейчас в теме

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

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

Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо
1. astracrypt 53 26.06.19 13:29 Сейчас в теме
Просто круто. Это гениально?
3. ogidni 124 26.06.19 14:07 Сейчас в теме
(1) это просто, может сам шифр и не сильно устойчив к шифрованию, но если немного изменить алгоритм, на индивидуальный, то на мой взгляд расшифровка станет невозможна ближайшие столетия, даже имея мощные Асики.
К примеру RSA алгоритмы, уже под угрозой расшифровки. 18 значный пароль, имея Хэндшейк(ключ согласования RSA) подбирается за 20 дней на Asic устройстве
2. SerVer1C 167 26.06.19 14:06 Сейчас в теме
Шифровать строки модуля обработки и хранить в ней же пароль?
4. ogidni 124 26.06.19 14:13 Сейчас в теме
(2)
Шифровать строки модуля обработки и хранить в ней же пароль?

Достаточно хранить хеш-код SHA256. С обрезанными пробелами он очень тяжело вытаскивается декомпилятором.
К примеру если пользоваться сторонними приложениями он легко вытаскивается как обращение 1С-ом к Capicom например.

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

      //Добавляем код 
    Хеш.Добавить("111111111111");
   КлючШифра = Хеш.ХешСумма;
   ///Конец добавки

	ЗашифрованныйТекст = ЗашифроватьТекст(массивТекста, МассивХеша);
Показать


Так же массив хеша можно добавить 1-10 мусорных символа. К примеру.
Если использовать обработку в чистом виде то можно. А если индивидуально допишите, то сложнее будет перехватывать
5. ogidni 124 26.06.19 15:00 Сейчас в теме
А если все это писать на C++. То можно вместа sha-256, Ethash Бутерина использовать с даг файлом на 2-4 гигабайта. Только тогда надо будет видеокарту задействовать.
6. wowik 579 26.06.19 15:41 Сейчас в теме
+1. Напишите мессенджер на андроид!
7. ogidni 124 26.06.19 16:41 Сейчас в теме
(6)
+1. Напишите мессенджер на андроид!

можно пользоваться телеграмм + плагин с доп шифрацией. Без RSA с передачей ключей лично в руки
8. wowik 579 26.06.19 17:58 Сейчас в теме
(7) не понял про плагин. Это в телеграм уже есть?
9. ogidni 124 26.06.19 18:05 Сейчас в теме
(8)еще нет надо сделать :-)
Месяц назад продал, машину. Ко мне приехал черовек из деревни с распечаткой где и когда я парковался, со всеми моими штрафами, неуплаченными налогами и временем прохождения то, и информацией об ОСАГО итп. Говорит в телеграмм канале за 500р купил.
И тут я решил пошифроваться.

ПыСы: Ты понимаешь Карл, человек из деревни знает обо мне почти все - куда это годится... если в гос органах информация льется как из душа.
Мало им того что фотки приходят жене со штрафами, а если я Бухгалтера подвез до банка - как жене это объяснить?!
Skripatch; for_sale; +2 Ответить
19. for_sale 764 30.06.19 09:46 Сейчас в теме
(9)
вэлкам ту зе рил ворлд))
10. Borisqa 27.06.19 09:58 Сейчас в теме
Никогда больше не лезьте в криптографию. Ваш алгоритм ломается за 1 секунду, т.к. "ключ" повторяется. Да это даже не ключ, а просто хэш от пароля, который даже перебирать не надо. Пожалуйста, оставьте эту затею и не вводите людей в заблуждение
Vovan1975; Perfolenta; SerVer1C; A_Max; +4 Ответить
12. ogidni 124 27.06.19 12:29 Сейчас в теме
(10)
Никогда больше не лезьте в криптографию. Ваш алгоритм ломается за 1 секунду, т.к. "ключ" повторяется. Да это даже не ключ, а просто хэш от пароля, который даже перебирать не надо. Пожалуйста, оставьте эту затею и не вводите людей в заблуждение

А если ключ при каждом повторе будет в степень "X" кратно соответсвующего символа? Вы не читали в тексте где написано - что алгоритм можно усложнять?
К примеру ту зависимость что на картинке картинке.
Или просто каждый раз хешировать ключевой хеш повторно при повторе? при таком раскладе думаю до конца галактической зимы будете расшировывать

За секунду он подберет., это вы в секундах световых лет ведете времяисчисление?
Ну в целом ваше невежество принято и зачтено.
Прикрепленные файлы:
14. SerVer1C 167 28.06.19 08:18 Сейчас в теме
(12) Месье хотел сказать, что не комильфо хранить и алгоритм, и пароль (или его аналог, который и будет использоваться для расшифровки) в открытом виде, а внешняя обработка 1с как раз и имеет открытый вид. А то, что Вы пытаетесь запутать алгоритм шифрования не усложнит стойкость ко взлому! Сравните свою поделку с реализацией AES.
15. ogidni 124 28.06.19 10:28 Сейчас в теме
(14) реализация AES хороша, главная проблема всех известных алгоритмов - та что он известна. И под них имеются Asic устройства.
Хранить ключи к шифру вас никто не заставляет.
Это так сказать ваше дело где хранить: в голове, на бумаге флешке или в облаке...
13. ogidni 124 27.06.19 19:49 Сейчас в теме
Добавлен сложный метод шифровки.
16. vsesam80 29.06.19 20:36 Сейчас в теме
(13)Интересно, а предложенный вами вариант более устойчив к взлому чем этот?: https://infostart.ru/public/518576/
18. Неопределено 53 30.06.19 06:31 Сейчас в теме
(16), (17), не понимаю в чём дело: я никогда не был в этой статье до текущего момента, но получил уведомления о ваших сообщениях как будто они были ответом на моё сообщение.
20. vsesam80 01.07.19 01:20 Сейчас в теме
(18)Может Инфостарт перевели на 1С движок. А у нас в 1С и не такое бывает, сами знаете)))
23. ogidni 124 01.07.19 01:31 Сейчас в теме
(20)да он изначально на. 1с битрексе
21. ogidni 124 01.07.19 01:22 Сейчас в теме
(18)может это знак к тому — что пора шифроваться
vsesam80; +1 Ответить
22. ogidni 124 01.07.19 01:24 Сейчас в теме
(16) изучу то что вы указали на днях напишу. Но лучше всего придумать свой принцип и держать его в голове. Даже зная пароль и не зная алгоритм — хрен кто что расшифрует. Я не претендую на то чтобы кто то использовал алгоритм для шифра, статья для шевеления мозга
17. Fox-trot 93 29.06.19 20:47 Сейчас в теме
(13) покажи еще скорость шифрования
24. ogidni 124 01.07.19 01:33 Сейчас в теме
(17) скорость на 1с? Откуда такое счастье, если только на 16 движке сделают реализацию OpenGL или Cuda
25. Неопределено 53 01.07.19 03:41 Сейчас в теме
Если интересно, могу скинуть как я делал sha-512 года 3 назад. Там, правда, подключался js скрипт и использовалась какая-то виндовая компонента.
27. ogidni 124 01.07.19 09:04 Сейчас в теме
28. Неопределено 53 01.07.19 09:38 Сейчас в теме
(27) Может быть, но я своё не выкладывал. Кстати, вспомнил: код js я переписал под 1С, так что там из стороннего использовалась только виндовая компонента криптографии.
29. ogidni 124 01.07.19 10:25 Сейчас в теме
(28)
нил: код js я переписал под 1С, так что там из стороннего использовалась только виндовая компонента криптографии.

может стоит выложить?
30. Неопределено 53 01.07.19 10:26 Сейчас в теме
(29) Вечером доберусь до домашнего компа и кину здесь в комментариях. Оно не стоит отдельной публикации.
31. Неопределено 53 01.07.19 10:35 Сейчас в теме
(29) Нашёл копию в облаке. Шифруемая строка называется ТекстЗапроса т.к. шифровался текст HTTP запроса к API. Переменная Секрет это API-ключ, он же соль.
Функция ЗашифроватьHMACSHA512(ТекстЗапроса, Секрет) 
	
	Текст = Новый COMОбъект("System.Text.UTF8Encoding");
	Криптография = Новый COMОбъект("System.Security.Cryptography.HMACSHA512");
	Криптография.Key = Текст.GetBytes_4(Секрет);
	ХешБайт = Криптография.ComputeHash_2(Текст.GetBytes_4(ТекстЗапроса)).Выгрузить();
	Шифр = "";
	Для Каждого Байт Из ХешБайт Цикл
	    База = 16;
	    Символ = "";
	    Пока Байт <> 0 Цикл
	       Поз = Байт % База;
	       Символ = Сред("0123456789ABCDEF", Поз + 1, 1) + Символ;
	       Байт = Цел(Байт / База);
	    КонецЦикла;
	    Шифр = Шифр + ?(СтрДлина(Символ) = 2, Символ, "0" + Символ);
	КонецЦикла;
	
	Шифр = нРег(Шифр);
	
	Возврат Шифр;
	
КонецФункции
Показать
32. Fox-trot 93 01.07.19 10:35 Сейчас в теме
(29) а сравнение скорости со штатной можешь выложить? просто интересно
34. ogidni 124 01.07.19 11:06 Сейчас в теме
(32) Вот пример реализации CUDA SHA256. Можете сделать внешнюю компоненту и передавать туда массив с данными необходимые к хешированию.
GPU карта распределит и быстро все посчитает. Для выполнения необходима Видеокарта GTX.

#ifndef SHA256_H
#define SHA256_H

#include <cstdint>


/****************************** MACROS ******************************/
#define SHA256_BLOCK_SIZE 32            // SHA256 outputs a 32 byte digest

#define ROTLEFT(a,b) (((a) << (b)) | ((a) >> (32-(b))))
#define ROTRIGHT(a,b) (((a) >> (b)) | ((a) << (32-(b))))

#define CH(x,y,z) (((x) & (y)) ^ (~(x) & (z)))
#define MAJ(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
#define EP0(x) (ROTRIGHT(x,2) ^ ROTRIGHT(x,13) ^ ROTRIGHT(x,22))
#define EP1(x) (ROTRIGHT(x,6) ^ ROTRIGHT(x,11) ^ ROTRIGHT(x,25))
#define SIG0(x) (ROTRIGHT(x,7) ^ ROTRIGHT(x,18) ^ ((x) >> 3))
#define SIG1(x) (ROTRIGHT(x,17) ^ ROTRIGHT(x,19) ^ ((x) >> 10))

#define checkCudaErrors(x) \
{ \
    cudaGetLastError(); \
    x; \
    cudaError_t err = cudaGetLastError(); \
    if (err != cudaSuccess) \
        printf("GPU: cudaError %d (%s)\n", err, cudaGetErrorString(err)); \
}
/**************************** DATA TYPES ****************************/
typedef unsigned char BYTE;             // 8-bit byte
typedef uint32_t  WORD;             // 32-bit word, change to "long" for 16-bit machines

typedef struct {
	BYTE data[64];
	WORD datalen;
	unsigned long long bitlen;
	WORD state[8];
} SHA256_CTX;

__constant__ WORD dev_k[64];

static const WORD host_k[64] = {
	0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,
	0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,
	0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,
	0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,
	0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,
	0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,
	0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,
	0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
};

/*********************** FUNCTION DECLARATIONS **********************/
char * print_sha(BYTE * buff);
__device__ void sha256_init(SHA256_CTX *ctx);
__device__ void sha256_update(SHA256_CTX *ctx, const BYTE data[], size_t len);
__device__ void sha256_final(SHA256_CTX *ctx, BYTE hash[]);

__device__ void mycpy12(uint32_t *d, const uint32_t *s) {
#pragma unroll 3
	for (int k = 0; k < 3; k++) d[k] = s[k];
}

__device__ void mycpy16(uint32_t *d, const uint32_t *s) {
#pragma unroll 4
	for (int k = 0; k < 4; k++) d[k] = s[k];
}

__device__ void mycpy32(uint32_t *d, const uint32_t *s) {
#pragma unroll 8
	for (int k = 0; k < 8; k++) d[k] = s[k];
}

__device__ void mycpy44(uint32_t *d, const uint32_t *s) {
#pragma unroll 11
	for (int k = 0; k < 11; k++) d[k] = s[k];
}

__device__ void mycpy48(uint32_t *d, const uint32_t *s) {
#pragma unroll 12
	for (int k = 0; k < 12; k++) d[k] = s[k];
}

__device__ void mycpy64(uint32_t *d, const uint32_t *s) {
#pragma unroll 16
	for (int k = 0; k < 16; k++) d[k] = s[k];
}

__device__ void sha256_transform(SHA256_CTX *ctx, const BYTE data[])
{
	WORD a, b, c, d, e, f, g, h, i, j, t1, t2, m[64];
	WORD S[8];

	//mycpy32(S, ctx->state);

#pragma unroll 16
	for (i = 0, j = 0; i < 16; ++i, j += 4)
		m[i] = (data[j] << 24) | (data[j + 1] << 16) | (data[j + 2] << 8) | (data[j + 3]);

#pragma unroll 64
	for (; i < 64; ++i)
		m[i] = SIG1(m[i - 2]) + m[i - 7] + SIG0(m[i - 15]) + m[i - 16];

	a = ctx->state[0];
	b = ctx->state[1];
	c = ctx->state[2];
	d = ctx->state[3];
	e = ctx->state[4];
	f = ctx->state[5];
	g = ctx->state[6];
	h = ctx->state[7];

#pragma unroll 64
	for (i = 0; i < 64; ++i) {
		t1 = h + EP1(e) + CH(e, f, g) + dev_k[i] + m[i];
		t2 = EP0(a) + MAJ(a, b, c);
		h = g;
		g = f;
		f = e;
		e = d + t1;
		d = c;
		c = b;
		b = a;
		a = t1 + t2;
	}

	ctx->state[0] += a;
	ctx->state[1] += b;
	ctx->state[2] += c;
	ctx->state[3] += d;
	ctx->state[4] += e;
	ctx->state[5] += f;
	ctx->state[6] += g;
	ctx->state[7] += h;
}

__device__ void sha256_init(SHA256_CTX *ctx)
{
	ctx->datalen = 0;
	ctx->bitlen = 0;
	ctx->state[0] = 0x6a09e667;
	ctx->state[1] = 0xbb67ae85;
	ctx->state[2] = 0x3c6ef372;
	ctx->state[3] = 0xa54ff53a;
	ctx->state[4] = 0x510e527f;
	ctx->state[5] = 0x9b05688c;
	ctx->state[6] = 0x1f83d9ab;
	ctx->state[7] = 0x5be0cd19;
}

__device__ void sha256_update(SHA256_CTX *ctx, const BYTE data[], size_t len)
{
	WORD i;

	// for each byte in message
	for (i = 0; i < len; ++i) {
		// ctx->data == message 512 bit chunk
		ctx->data[ctx->datalen] = data[i];
		ctx->datalen++;
		if (ctx->datalen == 64) {
			sha256_transform(ctx, ctx->data);
			ctx->bitlen += 512;
			ctx->datalen = 0;
		}
	}
}

__device__ void sha256_final(SHA256_CTX *ctx, BYTE hash[])
{
	WORD i;

	i = ctx->datalen;

	// Pad whatever data is left in the buffer.
	if (ctx->datalen < 56) {
		ctx->data[i++] = 0x80;
		while (i < 56)
			ctx->data[i++] = 0x00;
	}
	else {
		ctx->data[i++] = 0x80;
		while (i < 64)
			ctx->data[i++] = 0x00;
		sha256_transform(ctx, ctx->data);
		memset(ctx->data, 0, 56);
	}

	// Append to the padding the total message's length in bits and transform.
	ctx->bitlen += ctx->datalen * 8;
	ctx->data[63] = ctx->bitlen;
	ctx->data[62] = ctx->bitlen >> 8;
	ctx->data[61] = ctx->bitlen >> 16;
	ctx->data[60] = ctx->bitlen >> 24;
	ctx->data[59] = ctx->bitlen >> 32;
	ctx->data[58] = ctx->bitlen >> 40;
	ctx->data[57] = ctx->bitlen >> 48;
	ctx->data[56] = ctx->bitlen >> 56;
	sha256_transform(ctx, ctx->data);

	// Since this implementation uses little endian byte ordering and SHA uses big endian,
	// reverse all the bytes when copying the final state to the output hash.
	for (i = 0; i < 4; ++i) {
		hash[i] = (ctx->state[0] >> (24 - i * 8)) & 0x000000ff;
		hash[i + 4] = (ctx->state[1] >> (24 - i * 8)) & 0x000000ff;
		hash[i + 8] = (ctx->state[2] >> (24 - i * 8)) & 0x000000ff;
		hash[i + 12] = (ctx->state[3] >> (24 - i * 8)) & 0x000000ff;
		hash[i + 16] = (ctx->state[4] >> (24 - i * 8)) & 0x000000ff;
		hash[i + 20] = (ctx->state[5] >> (24 - i * 8)) & 0x000000ff;
		hash[i + 24] = (ctx->state[6] >> (24 - i * 8)) & 0x000000ff;
		hash[i + 28] = (ctx->state[7] >> (24 - i * 8)) & 0x000000ff;
	}
}

#endif   // SHA256_H
Показать
26. dj_tol 85 01.07.19 05:06 Сейчас в теме
Молодец. Я тоже как-то занимался шифрованием ярлыков 1С. Тема интересная.
33. ogidni 124 01.07.19 10:46 Сейчас в теме
(26)Хм это не ваш код нашим клиентам все данные зашифровал и просил червонец? ;-)
35. dj_tol 85 01.07.19 14:01 Сейчас в теме
Нет. Я ярлыки запуска шифровал, что бы не понятно было где база лежит
36. vsesam80 01.07.19 21:10 Сейчас в теме
было бы здорово, если бы кто нибудь выложил пример шифрования на JS. Это нужно для мобильной платформы. Там виндовой компоненты нет и с шифрованием всё грустно. А между тем мобильное приложение на 1С весьма востребовано
37. ogidni 124 03.07.19 10:07 Сейчас в теме
(36) а как же объект System.Security.Cryptography? На JS не работает?
38. vsesam80 03.07.19 20:07 Сейчас в теме
(37)Работает, но я хотел это применить на мобильной платформе, а там ДотНета не имеется
39. ogidni 124 04.07.19 10:11 Сейчас в теме
(38) А что шифровать будете? Текстовые поля?
40. vsesam80 04.07.19 16:10 Сейчас в теме
(39)Именно! Идея такая - юзер в офлайне шифрует свои данные.
Есть конечно вариант через HTTPS. например юзер вносит данные по "безопасному каналу", они даже не хранятся на смартфоне. Скачиваются по мере необходимости - по запросу. И даже если смарт украдут или потеряют, данные всё равно на серваке.
А есть вариант офлайн, когда строковые поля справочника шифруются. А пароль для дешифровки вводится пр запуске приложения. И даже можно пустить злоумышленика далее в приложение - он всё равно получит билеберду, вместо осмысленного текста.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Консультант 1С
Нижний Новгород
зарплата до 100 000 руб.
Полный день

Программист стажер 1С
Нижний Новгород
зарплата от 30 000 руб.
Полный день

Программист 1С
Нижний Новгород
зарплата до 100 000 руб.
Полный день

Программисты 1С УТ / БУЗ/ЗУП / БИТ ФИНАНС
Москва
зарплата от 100 000 руб. до 180 000 руб.
Полный день

Программист 1С
Владивосток
зарплата от 60 000 руб. до 90 000 руб.
Полный день