Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/133: Рейтинг темы: голосов - 133, средняя оценка - 4.91
dyid_omsi

Алгоритм ГОСТ ( простой) для STM32

12.11.2015, 13:14. Показов 28250. Ответов 49
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//таблица замены
static const char Table[8][16]={
{0x04,0x0a,0x09,0x02,0x0d,0x08,0x00,0x0e,0x06,0x0B,0x01,0x0c,0x07,0x0f,0x05,0x03},
{0x0e,0x0b,0x04,0x0c,0x06,0x0d,0x0f,0x0a,0x02,0x03,0x08,0x01,0x00,0x07,0x05,0x09},
{0x05,0x08,0x01,0x0d,0x0a,0x03,0x04,0x02,0x0e,0x0f,0x0c,0x07,0x06,0x00,0x09,0x0b},
{0x07,0x0d,0x0a,0x01,0x00,0x08,0x09,0x0f,0x0e,0x04,0x06,0x0c,0x0b,0x02,0x05,0x03},
{0x06,0x0c,0x07,0x01,0x05,0x0f,0x0d,0x08,0x04,0x0a,0x09,0x0e,0x00,0x03,0x0b,0x02},
{0x04,0x0b,0x0a,0x00,0x07,0x02,0x01,0x0d,0x03,0x06,0x08,0x05,0x09,0x0c,0x0f,0x0e},
{0x0d,0x0b,0x04,0x01,0x03,0x0f,0x05,0x09,0x00,0x0a,0x0e,0x07,0x06,0x08,0x02,0x0c},
{0x01,0x0f,0x0d,0x00,0x05,0x07,0x0a,0x04,0x09,0x02,0x03,0x0e,0x06,0x0b,0x08,0x0c}};
//Ключ
unsykned int NewKey[8]={123,456,789,1011,1213,1415,1617,1819};
 
/*кодирование
Dat - буфер,выравненный по  32 байт
size размер в  блоках по 64 бита
mode - 0 кодировать
1 раскодировать
*/
 
void Crupt(unsykned int *Dat,unsykned int  *Key,char size,char mode)
{
//таблица таблиц подстановки. имеем 1 копию ключа, таблица говорит
//какие элементы на каком шаге использовать
static   const char KeyMap[2][32]={
{0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0},
{0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,7,6,5,4,3,2,1,0,7,6,5,4,3,2,1,0}};
 
unsykned  char Step,m,i;
unsykned int L,R,S,K;
 
while (size)
{
L=   Dat[0];
R=   Dat[1];
for(Step=0;Step<32;Step++)
{
// ключ текущего шага
K=   Key[KeyMap[mode][Step]];
S=   R+K;//сумма
//подстановка
for (m=0;m<8;m++)
{
i=(char) S&0x0f; //возьмем 4 бита
S&=~0xf;               //сбросим младшие 4 бита
S|=   (Table[m][i])&0x0f;      //берем 4 бита подстановки
__asm {ror S,4} //провернем вправо на 4 бита
}
__asm {ror S,21} //провернем влево на 11 бита
K=S^L; //xor левый и результат
L=R;
R=K;
}
//меняем местами младший и старший
Dat[0]=R;
Dat[1]=L;
Dat+=2; //следующий блок
size--;
}
}
Пример штфрование

Code
1
2
3
4
5
6
//исходный текст
char Text[16]="Строку кодируем;
//Ключ
unsykned int NewKey[8]={123,456,789,1011,1213,1415,1617,1819};
//зашифровать
Crupt((unsykned int *) &Text,NewKey,2,0 );
В результате в массиве Text будет зашифрованный текст
Code
1
2
//Расшифровать
Crupt((unsykned int *) &Text,NewKey,2,1 );
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.11.2015, 13:14
Ответы с готовыми решениями:

ГОСТ 28147-89 Режим простой замены. Алгоритм
Добрый день. Решил написать программу, позволяющую зашифровать и расшифровать текст по ГОСТу 28147089 режимом простой замены. Программу...

Алгоритм шифрования ГОСТ 28147-89. Режим простой замены
Реализовывал алгоритм по wiki. Но что то не то получилось.Вот код: using System; using System.Collections; using...

Алгоритм блочного шифрования ГОСТ 28147-89 в режиме простой замены
Добрый вечер! Нашел программную реализацию на С++ алгоритма блочного шифрования ГОСТ 28147-89 в режиме простой замены. Можете объяснить,...

49
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 117
12.11.2015, 21:12
Цитата Сообщение от dyid_omsi
Код:
//таблица замены
static const char Table[8][16]={
{0x04,0x0a,0x09,0x02,0x0d,0x08,0x00,0x0e ,0x06,0x0B,0x01,0x0c,0x07,0x0f,0x05,0x03 },
{0x0e,0x0b,0x04,0x0c,0x06,0x0d,0x0f,0x0a ,0x02,0x03,0x08,0x01,0x00,0x07,0x05,0x09 },
{0x05,0x08,0x01,0x0d,0x0a,0x03,0x04,0x02 ,0x0e,0x0f,0x0c,0x07,0x06,0x00,0x09,0x0b },
{0x07,0x0d,0x0a,0x01,0x00,0x08,0x09,0x0f ,0x0e,0x04,0x06,0x0c,0x0b,0x02,0x05,0x03 },
{0x06,0x0c,0x07,0x01,0x05,0x0f,0x0d,0x08 ,0x04,0x0a,0x09,0x0e,0x00,0x03,0x0b,0x02 },
{0x04,0x0b,0x0a,0x00,0x07,0x02,0x01,0x0d ,0x03,0x06,0x08,0x05,0x09,0x0c,0x0f,0x0e },
{0x0d,0x0b,0x04,0x01,0x03,0x0f,0x05,0x09 ,0x00,0x0a,0x0e,0x07,0x06,0x08,0x02,0x0c },
{0x01,0x0f,0x0d,0x00,0x05,0x07,0x0a,0x04 ,0x09,0x02,0x03,0x0e,0x06,0x0b,0x08,0x0c }};
//Ключ
unsykned int NewKey[8]={123,456,789,1011,1213,1415,1617,1819};

/*кодирование
Dat - буфер,выравненный по 32 байт
size размер в блоках по 64 бита
mode - 0 кодировать
1 раскодировать
*/

void Crupt(unsykned int *Dat,unsykned int *Key,char size,char mode)
{
//таблица таблиц подстановки. имеем 1 копию ключа, таблица говорит
//какие элементы на каком шаге использовать
static const char KeyMap[2][32]={
{0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7,0,1,2,3 ,4,5,6,7,7,6,5,4,3,2,1,0},
{0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,7,6,5,4 ,3,2,1,0,7,6,5,4,3,2,1,0}};

unsykned char Step,m,i;
unsykned int L,R,S,K;

while (size)
{
L= Dat[0];
R= Dat[1];
for(Step=0;Step<32;Step++)
{
// ключ текущего шага
K= Key[KeyMap[mode][Step]];
S= R+K;//сумма
//подстановка
for (m=0;m<8;m++)
{
i=(char) S&0x0f; //возьмем 4 бита
S&=~0xf; //сбросим младшие 4 бита
S|= (Table[m][i])&0x0f; //берем 4 бита подстановки
__asm {ror S,4} //провернем вправо на 4 бита
}
__asm {ror S,21} //провернем влево на 11 бита
K=S^L; //xor левый и результат
L=R;
R=K;
}
//меняем местами младший и старший
Dat[0]=R;
Dat[1]=L;
Dat+=2; //следующий блок
size--;
}
}

Вы хвастаетесь или спрашиваете ?
0
0 / 0 / 0
Регистрация: 20.07.2012
Сообщений: 620
13.11.2015, 04:50
Делится, я думаю... Хорошо б еще сказали, что это такое.
0
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 117
13.11.2015, 13:00
Цитата Сообщение от Myrmyk
Делится, я думаю... Хорошо б еще сказали, что это такое.
А что там не понятного то? Алгоритм ГОСТ для СТМ32
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
14.11.2015, 10:56
Да уж...
Я понимаю, краткость - сестра таланта, но хотелось бы не столь лаконичного описания.
А ещё есть такое понятие, как примеры применения (example) ...

И вообще - что за ГОСТ такой и где применяется?
0
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 300
14.11.2015, 11:02
https://ru.wikipedia.org/wiki/%D0%93%D0 ... 2_28147-89
0
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 488
26.11.2015, 08:20
Вот применения:
1. обновление прошивки клинту. Выдаём файл с зашифрованной прошивкой, а ключ для расшифровки внутри контроллера с Readout Protection.
2. зашифрованный протокол обмена между устройствами, которые имеют ключ

НО я пришёл к выводу, что нужно делать свои мудрёные алгоритмы. Там могут быть перестановки бит с плавающей длиной слова в битах + лишние биты с распределением вероятности как у основных + нелинейная хрень с нестандартным округлением. А когда алгоритм шифрования известен, то какой-нибудь увлечённый человек возмёт видекарту и за пару месяцев додумается как оно работает. Или кто-нибудь нобелевку внезапно получит по расшифровке на калькуляторе за 1мс чего-то, что ранее считалось супер-надёжным (математически доказанным!). Давайте посмотрим сколько из нас разбирающихся в самых последних теориях матанализа. На форумах днями спорят о доказательствах того, что 2+2=5. А щас ещё эти биткоины, спец процессоры.

Исходник интересный, даже asm есть, если скорость критична. Для надежности нужно добавить поверх чего-нибудь своего.
0
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
26.11.2015, 10:32
Защиту обычно делают не "на века", а на время что бы расшифровка оказалась дольше создания аналогичной программы или потери актуальности данных. Т.ч. особо извращаться особого смысла обычно нет.
И я в свое время делал аналог этого алгоритма на асме для авр. Работал, но был довольно медленный. Для расшифровки на лету проще использовать что-то вроде RC-4.
0
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
26.11.2015, 12:12
Цитата Сообщение от tmttyb
НО я пришёл к выводу, что нужно делать свои мудрёные алгоритмы. ... На форумах днями спорят о доказательствах того, что 2+2=5.
видимо, к этому выводу подтолкнули как раз такие вот форумы.

первое правило криптографии: не изобретай криптографию. причем, это относится не только к алгоритмам шифрования, а и к применению их.

правило защиты: чтобы сделать эффективную защиту, ты обязан знать способы (и чего они стоят), которыми ее можно ломать. если ты не ботан от математики - не делай схемы, которые ты сам не понимаешь как работают и что стоит их взломать. тебе покажется, что ты всё запутал, а реально ты можешь на порядки все упростить.
Цитата Сообщение от tmttyb
А когда алгоритм шифрования известен, то какой-нибудь увлечённый человек возмёт видекарту и за пару месяцев додумается как оно работает. Или кто-нибудь нобелевку внезапно получит по расшифровке на калькуляторе за 1мс чего-то, что ранее считалось супер-надёжным (математически доказанным!).
ну да. aes, sha и даже md5 уже давно полностью взломали увлеченные человеки. и нобелевки получили они же. всё сходится. ВНЕЗАПНО!
0
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 48
26.11.2015, 19:54
В выборе между ГОСТ и AES не вижу ни одного аргумента в пользу ГОСТ.
Даже чисто программные реализации AES на STM32F10x работают очень быстро, вплоть до 80 тысяч блоков в секунду.
ГОСТ -- медленный и не всегда надёжный -- см. ту же википедию.

Цитата Сообщение от Ymk
ну да. aes, sha и даже md5 уже давно полностью взломали увлеченные человеки. и нобелевки получили они же. всё сходится. ВНЕЗАПНО!
Не всё так просто. Лет 10+ назад я частично обратил MD4 (частный случай, когда входная строка короткая и часть её уже известна).
Перебор ускорился больше чем на порядок по сравнению с просто хорошо оптимизированным подсчётом MD5.
С MD5 такой фокус не прошёл бы, но я не математик и на нобелевку не претендую.

В любом случае это не повод изобретать свои алгоритмы.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
26.11.2015, 20:34
Цитата Сообщение от tmttyb
НО я пришёл к выводу, что нужно делать свои мудрёные алгоритмы.
Security by obscurity - плохая идея. Масса народа наступала на эти грабли: самописные алгоритмы не тестируются криптографами, и шанс найти в таком алгоритме дырку стремится к единице.
Разве что как один из слоёв в комплексе с известными алгоритмами.
0
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
27.11.2015, 08:29
Цитата Сообщение от oomomstir
Разве что как один из слоёв в комплексе с известными алгоритмами.
это если очень повезет. есть отличный курс на курсере про криптографию, там куча пруфов таких вот решений и "усложнений" из реальной жизни.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
27.11.2015, 11:11
Ymk, в смысле, что можно по неосторожности своим кривым слоем убить криптостойкость проверенных слоёв?
Оно так, но тут хотя бы есть неплохие шансы этого избежать.

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

Пример: данные, подаваемые на AES, предварительно ксорятся на 55h (предельно бесполезно, но иллюстрирует идею).
0
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
27.11.2015, 17:56
Цитата Сообщение от oomomstir
Кстати, если помните эти примеры или они под рукой - скажите, есть ли среди них что-нибудь, удовлетворяющее следующим нехитрым условиям
ну это было пару-тройку лет назад, я уже многое забыл. еще и не очень понял условия:)

припоминаю случай с des. когда его стало "мало", товарищи решили просто последовательно добавить еще. получился 3des. почему 3, а не 2, например? потому что с двумя возможна атака meet in the middle. т.е. вроде как ключ увеличился аж в 2 раза, а профиту нет.

а так, самые частые косяки, на которые натыкаются новички, это replay attack, romdom attack и режим ecb шифров. тут в принципе никакой шифр не спасет.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
27.11.2015, 18:31
Ymk, интересно - я-то думал, что 3des имеет такую схему только для совместимости с просто des (никогда не пытался оценить его сложность). Но, в принципе, в случае двойного des от дополнительного слоя именно что "профиту нет", а не вред.

А romdom attack - это что? Использование косяков Г(П)СЧ?

SGE, я просто как пример привёл. Мог бы ROT13 назвать, охренительный шифр :-D
0
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
27.11.2015, 19:01
Цитата Сообщение от oomomstir
Но, в принципе, в случае двойного des от дополнительного слоя именно что "профиту нет", а не вред.
если расчет на более длинный ключ, то "профиту нет" = "вред". скажем, можно взять аес 128 или 2 дес, но последний оказывается значительно хуже. пример явного ухудшения с ходу не вспомню.
Цитата Сообщение от oomomstir
А romdom attack - это что?
ну например расшифрованный пакет хранит байт команды, байт параметра и коротенький црц, на остальные байты забивают. атакующий шлет просто рандом, он расшифровывается, проверяется црц или просто тип команды. таким образом, просто отправляя рандом можно заставлять девайс что-то выполнять, а главное, что за минимум попыток. и мало кто из новичков знает, например, об атаке дней рождения и даже когда считает кол-во попыток для перебора, то ошибается на порядки.
Цитата Сообщение от SGE
xor 55h (AAh) не как доп. шифрование. Это прореживание однообразных последовательностей, т.е. чтобы подряд много нулей или много единиц не было.
для криптофункций это прореживание полностью бесполезно, на выходе будет "белый шум" в любом случае. есть подобное в hmac, но для других целей.
0
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
28.11.2015, 03:08
SGE, ссылка на пруф от математиков есть?
0
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
28.11.2015, 03:48
Кстати, я обнаружил что программный генератор рандома выдаёт прогнозируемый набор чисел в случае известного начального старта. Отпадает надобность в таблицах, требуется всего-лишь один ключ в известное вам место прошивки. Так-как загрузчик будет недоступен пользователю для просмотра - то вероятность взлома неизвестного алгоритма стремиться к нулю.
Спрятать дешефровщик в открытом коде - это высший уровень программирования. Самый простой и доступный - запутать пользователя стократными вложениями дифлайнов, с отменами и преназначениями. Это кстати очень часто применяется - чаще чем хотелось-бы.
0
0 / 0 / 0
Регистрация: 26.01.2009
Сообщений: 3
28.11.2015, 03:53
Цитата Сообщение от SGE
Ключ или данные с большими последовательностями нулей или единиц понижают в разы крипкостойкость. Прореживание убирает подобную однородность.
Контрольный вопрос: играем в казино, и замечаем, что 10 раз подряд выпало красное. На что ставить будем и почему?
0
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
28.11.2015, 04:36
Да я не про это.
Просто есть много мк у которых мало флеша, но обновлять их нужно по тех_условию, например менять алгоритм датчика присутствия в очень труднодоступном месте. Туда полноценный дешефровщик просто не влезет, а ставить более жирный мк накладно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.11.2015, 04:36
Помогаю со студенческими работами здесь

Реализовать алгоритм блочного шифрования ГОСТ 28147-89 в режиме простой замены
Добрый день! Подскажите, пожалуйста, как реализовать алгоритм блочного шифрования ГОСТ 28147-89 в режиме простой замены в Matlab?!

Алгоритм ГОСТ 28147-89 для изображений
Здравствуйте! Есть алгоритм ГОСТ 28147-89 для файлов текстового формата, а нужно для изображений. Что необходимо изменить в программе для...

Не работает шифрование по ГОСТ 28147-89, ГОСТ Р 34.10-2001,ГОСТ Р 34.11-94 (ASP.NET)
Создавал веб-приложение(ASP.Net) для шифрования по данным гостам, нашёл по данной теме код, но он не рабочий(VS ошибок не выдаёт, но при...

ГОСТ 28147-89. Метод простой замены
Доброй ночи, уважаемые форумчане! У меня есть исходный код программы: ...

ГОСТ 28147-89 режим простой замены
Добрый день, уважаемые формучане. Решил написать программу, которая реализует ГОСТ в режиме простой замены. Вот код: // 212.cpp:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru