Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/226: Рейтинг темы: голосов - 226, средняя оценка - 5.00
38 / 13 / 6
Регистрация: 12.06.2013
Сообщений: 24

Реализация алгоритма шифрования по ГОСТ 28147-89

02.03.2014, 20:16. Показов 46256. Ответов 23

Студворк — интернет-сервис помощи студентам
Добрый день! Пытаюсь реализовать все тот же алгоритм шифрования ГОСТ-89. Уже целую неделю долблюсь, и никак не могу понять, в чем моя ошибка. Значит, вкратце о проекте:
- В основе данного алгоритма лежит основной шаг криптопреобразования. Он реализован в структуре BasicSteep:
Кликните здесь для просмотра всего текста
C#
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using System;
 
namespace Crypto
{
    struct BasicStep
    {
        uint N1, N2, X;
 
        public BasicStep(ulong dateFragment, uint keyFragment) 
        {
            N1 = (uint)(dateFragment >> 32);     //Младшая часть файла
            N2 = (uint)((dateFragment << 32) >> 32);     //Старшая часть файла
            X = keyFragment;
        }
 
        public ulong BasicEncrypt()
        {
            return (FourthAndFifthStep(ThirdStep(SecondStep(FirstStep()))));
        }
        
        //Сложение по модулю 2^32 младшей части с фрагментом ключа
        private uint FirstStep()
        {
            return (uint)((X + N1) % (Convert.ToUInt64(Math.Pow(2, 32)))); 
        }
        
        //Использование таблицы замены
        private uint SecondStep(uint S)
        {
            uint newS, S0, S1, S2, S3, S4, S5, S6, S7;
            
            //Разбиваем младшую часть файла на 8 4-х битовых чисел
            S0 = S >> 28;
            S1 = (S << 4) >> 28;
            S2 = (S << 8) >> 28;
            S3 = (S << 12) >> 28;
            S4 = (S << 16) >> 28;
            S5 = (S << 20) >> 28;
            S6 = (S << 24) >> 28;
            S7 = (S << 28) >> 28;
 
            //Производим замену по таблице замен
            S0 = ReplacementTab.Table0[S0];
            S1 = ReplacementTab.Table0[0x10 + S1];
            S2 = ReplacementTab.Table0[0x20 + S2];
            S3 = ReplacementTab.Table0[0x30 + S3];
            S4 = ReplacementTab.Table0[0x40 + S4];
            S5 = ReplacementTab.Table0[0x50 + S5];
            S6 = ReplacementTab.Table0[0x60 + S6];
            S7 = ReplacementTab.Table0[0x70 + S7];
 
            //Склеиваем 4-х битовые числа в одно 32-х битовое
            newS = S7 + (S6 << 4) + (S5 << 8) + (S4 << 12) + (S3 << 16) +
                    (S2 << 20) + (S1 << 24) + (S0 << 28);
 
            return newS;
        }
 
        //Циклический сдвиг на 11 бит влево
        private uint ThirdStep(uint S)
        {
            return (uint) (S << 11) | (S >> 21);
        }
 
        private ulong FourthAndFifthStep(uint S)
        {
            ulong N;
            
            S = (N2 ^ S);        //Сложение по модулю 2 старшего фрагмента данных с полученным из.... 
                                       //... ThirdStep() числом
            //Сдвиг по цепочке
            N2 = N1;
            N1 = S;
 
            //Склеиваем младший и старший фрагмент в один 64-х битовый блок данных
            N = ((ulong)N2) | (((ulong)N1) << 32);
 
            return N;
        }
    }
}

Механизм зашифровки 32-З реализован в классе E32:
Кликните здесь для просмотра всего текста
C#
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
using System;
 
namespace Crypto
{
    class E32
    {
        static E32 e32 = null;
        byte[] byteFile, byteKey, encrByteFile;
        uint[] uintKey;
        ulong[] ulongFile, ulNewFile;
 
        private E32() { }
 
        private E32(byte[] file, byte[] key)
        {
            byteFile = file;
            byteKey = key;
 
            //Создание массива из 32-х битовых фрагментов ключа
            DatePartition part = new DatePartition(byteKey, DatePartition.FileType.Key);
            uintKey = part.GetKey;
 
            //Создание массива из 64-х битовых фрагментов данных
            part = new DatePartition(byteFile, DatePartition.FileType.File);
            ulongFile = part.GetFile;
 
            ulNewFile = ulongFile;
 
            //Получение зашифрованного фрагмента данных в виде байт-массива encrByteFile[]
            ConvertToByte(EncryptFile());
        }
 
        //Публичное свойство для получения зашифрованного байт-массива
        public byte[] GetEncryptFile
        {
            get { return encrByteFile; }
        }
     
        //Публичный метод для получения единственного экземпляра объекта класса
        public static E32 StartE32(byte[] file, byte[] key)
        {
            if (e32 == null)
                e32 = new E32(file, key);
            
            return e32;
        }
 
        //Непосредственная реализация 32-З (3 раза К0-К7 и 1 раз К7-К0)
        private ulong[] EncryptFile()
        {
            BasicStep[] K = new BasicStep[8];
            ulNewFile[0] = ulongFile[0];
 
            for (int j = 0; j < 3; j++)
            {
                for (int i = 0; i < K.Length; i++)
                {
                    K[i] = new BasicStep(ulNewFile[0], uintKey[i]);
                    ulNewFile[0] = K[i].BasicEncrypt();
                }
            }
 
            for (int i = K.Length - 1; i >= 0; i--)
            {
                K[i] = new BasicStep(ulNewFile[0], uintKey[i]);
                ulNewFile[0] = K[i].BasicEncrypt();
            }
 
            return ulNewFile;
        }
 
        //Метод для конвертации массива ulong в байт-массив
        private void ConvertToByte(ulong[] fl)
        {
            byte[] newFile = new byte[8];
            uint part1, part2;
            string str, str1, str2;
            string[] arrStr = new string[8];
 
            part1 = (uint)(fl[0] >> 32);
            part2 = (uint)((fl[0] << 32) >> 32);
 
            str1 = Convert.ToString(part1, 2);
            while (str1.Length < 32)
                str1 = "0" + str1;
 
            str2 = Convert.ToString(part2, 2);
            while (str2.Length < 32)
                str2 = "0" + str2;
 
            str = str1 + str2;
 
            int count = 0;
 
            for (int i = 0; i < str.Length; i++)
            {
                if ((i % 8 == 0) && (i != 0))
                    count++;
 
                arrStr[count] += str[i];
            }
 
            for (int i = 0; i < arrStr.Length; i++)
            {
                newFile[i] = Convert.ToByte(arrStr[i], 2);
            }
 
            encrByteFile = newFile;
        }
    }
}

Для расшифровки (32-Р) реализован аналогичный класс D32, отличается только порядком действий в методе DecryptFile() (1 раз К0-К7 и 3 раза К7-К0).
Ошибка скорее всего заключена в самом алгоритме. Как я это понял: Если в методе EncryptFile() оставить только 2 строки
C#
1
2
ulNewFile[0] = ulongFile[0];
return ulNewFile;
при запуске шифрования на выходе получим исходный файл. Значит, все преобразования, помимо самого шифра работают корректно. Может, я что-то не так понял в самом алгоритме шифрования?
Надеюсь на вашу помощь)

З.Ы.: Весь проект в прикрепленном файле. В папке Debug есть два файла: 1.txt - 8-ми байтовый текстовый файл для зашифровки и файл key - 256-битовый файл ключа.
Вложения
Тип файла: zip Crypto.zip (82.2 Кб, 655 просмотров)
4
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.03.2014, 20:16
Ответы с готовыми решениями:

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

Нужны исходники программы шифрования и дешифрования файлов на базе алгоритма ГОСТ 28147-89
у кого есть исходники программы шифрования и дешифрования файлов на базе алгоритма ГОСТ 28147-89 в режиме простой замены и выработки...

Реализация шифра ГОСТ 28147-89
Всем привет. Вот решил загнаться комбинированной системой шифрования с шифрами ГОСТ 28147-89 и RSA. Пока засел на ГОСТе. Сам алгоритм я...

23
0 / 0 / 0
Регистрация: 28.10.2021
Сообщений: 14
25.05.2022, 18:07
Студворк — интернет-сервис помощи студентам
Не подскажите подробнее, как реализовать вывод результата в виде двоичных чисел? Заранее спасибо!
0
0 / 0 / 0
Регистрация: 28.10.2021
Сообщений: 14
26.05.2022, 08:09
Добрый день! А подробнее можете рассказать про вывод результата в виде двоичных чисел в цикле?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
26.05.2022, 11:36
Цитата Сообщение от vipip2007xp Посмотреть сообщение
А подробнее можете рассказать про вывод результата в виде двоичных чисел в цикле?
Сначала по интерфейсу Форума:
 Комментарий модератора 
При обращении к другому пользователю указывайте его ник в тегах [NICK][/NICK] или цитируйте часть сообщения на которое отвечаете.
В противном случае ему не придёт уведомление о вашем обращении и вы можете не дождаться ответа на своё сообщение.

Для вставки ника: введите ник, выделите его и нажмите кнопку "Динамик" на панели редактора сообщений.
Или кликните по нику автора сообщения в панели слева от текста его сообщения.

Для вставки цитаты: выделите нужную цитату, должна появиться всплывающая кнопка "Цитировать", нажмите её.


Второе.
Ладно бы ещё подняли старую тему по вопросу указанному в ней.
Но ваш вопрос не относится собственно к реализации шифрования.
Создайте новую тему (в которой можете сослаться на эту) и в ней опишите что вы сделали, какие у вас данные и как и где нужно их представить.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18331 / 14257 / 5370
Регистрация: 17.03.2014
Сообщений: 28,920
Записей в блоге: 1
26.05.2022, 17:21
Цитата Сообщение от vipip2007xp Посмотреть сообщение
А подробнее можете рассказать про вывод результата в виде двоичных чисел в цикле?
Не знаю что тут рассказывать. Похоже проще показать.
C#
1
2
3
4
5
6
7
8
byte[] bytes = {54, 78, 146, 4, 235};
var sb = new StringBuilder(bytes.Length*8 + bytes.Length-1);
foreach (var b in bytes)
{
    if (sb.Length > 0) sb.Append(' ');
    sb.Append(Convert.ToString(b, 2).PadLeft(8, '0'));
}
string binaryString = sb.ToString();
Для кода шифрования адаптируйте самостоятельно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.05.2022, 17:21
Помогаю со студенческими работами здесь

Реализация алгоритма ГОСТ Р 34.10-94
Есть ли у кого-нибудь исходник программы, реализующую данный алгоритм?

Реализация шифрования по ГОСТ 28147-89
Добрый день. Возникла необходимость реализовать данный алгоритм шифрования. Изучил труды Винокурова и сам ГОСТ. Не могу отладить код......

Рализовать Si блок алгоритма шифрования ГОСТ 28147
Задание 1. Рализовать Si блок алгоритма шифрования ГОСТ 28147

алгоритм шифрования ГОСТ 28147-89
писалось на коленке за 1 день. режим простой замены.для имитовставки воспользоваться 2 раундами. здесь же,подсчет CRC32 взят у...

Алгоритм шифрования ГОСТ 28147-89
Всем привет, реализую алгоритм данный алгоритм шифрования, хотелось бы прояснить пару моментов. Не совсем понимаю, как считывать файлы:...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru