Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
0 / 0 / 2
Регистрация: 09.06.2014
Сообщений: 14

ГОСТ 28147-89

05.01.2017, 18:30. Показов 4066. Ответов 3

Студворк — интернет-сервис помощи студентам
73 3d 2c 20 65 68 65 73 74 74 67 69 79 67 61 20 62 6e 73 73 20 65 73 69 32 6c 65 68 33 20 6d 54,
шифрую 00 00 00 00 00 00 00 00. В начале разбиваю текст на две половины: B = 00 00 00 00 и A = 00 00 00 00 и ключ на 8 частей:

K1 = 33 20 6d 54,
K2 = 32 6c 65 68,
K3 = 20 65 73 69,
K4 = 62 6e 73 73,
K5 = 79 67 61 20,
K6 = 74 74 67 69,
K7 = 65 68 65 73,
K8 = 73 3d 2c 20.

Затем складываю A с K1 по модулю 2 в 32 степени, получаю 33 20 6d 54. В качестве таблицы замен использую:

{4, e, 5, 7, 6, 4, d, 1},
{a, b, 8, d, c, b, b, f},
{9, 4, 1, a, 7, a, 4, d},
{2, c, d, 1, 1, 0, 1, 0},
{d, 6, a, 0, 5, 7, 3, 5},
{8, d, 3, 8, f, 2, f, 7},
{0, f, 4, 9, d, 1, 5, a},
{e, a, 2, f, 8, d, 9, 4},
{6, 2, e, e, 4, 3, 0, 9},
{b, 3, f, 4, a, 6, a, 2},
{1, 8, c, 6, 9, 8, e, 3},
{c, 1, 7, c, e, 5, 7, e},
{7, 0, 6, b, 0, 9, 6, 6},
{f, 7, 0, 2, 3, c, 8, b},
{5, 5, 9, 5, b, f, 2, 8},
{3, 9, b, 3, 2, e, c, c}.
3 заменяю на 2, 3 на c, 2 на 1, 0 на 7, 6 на d, d на c, 5 на f, 4 на 5. Получаю 2c 17 dc f5.
Циклический сдвиг влево на 11 бит даёт: be e7 a9 60
Далее полученный результат XOR B и получаю be e7 a9 60
Теперь сама проблема: После всех 32 шагов цикла результат должен быть равен 42 AB BC CE 32 BC 0B 1B (пример из ГОСТ 34.11-94. https://ru.wikipedia.org/wiki/... 0_34.11-94), но он получается другим. Подскажите, пожалуйста, что я делаю неправильно?
Код на java:
Java
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
private String encrypt(BigInteger[] key, String strForA, String strForB)  
{  
    int index = 0;  
    BigInteger A = new BigInteger(strForA, 16);  
    BigInteger B = new BigInteger(strForB, 16);  
    BigInteger interA = BigInteger.ZERO;  
 
    System.out.println("A = " + A.toString(16));
 
    for (int i = 0; i < 32; i++)
    {
        System.out.println("ЦИКЛ " + i);
        if (i < 24)
            index = i % 8;
        else
            index = 7 - (i % 8);
        interA = multiply(A, key[index]);
        interA = B.xor(interA);
        if (i < 31)
        {
            B = A;
            A = interA;
        }
        else
            B = interA;
 
 
    }
 
    String resultB = B.toString(16);
    String resultA = A.toString(16);
 
    while (resultB.length() % 2 != 0)
        resultB = 0 + resultB;
    while (resultA.length() % 2 != 0)
        resultA = 0 + resultA;
 
    return resultB + resultA;
}
 
private BigInteger multiply(BigInteger a, BigInteger b)
{
    BigInteger sum = a.add(b).mod(MODUL);
 
    String sumString = sum.toString(16);
    String newSumString = "";
 
 
    while (sumString.length() < 8)
        sumString = 0 + sumString;
 
    for (int i = 0; i < sumString.length(); i++)
    {
        newSumString += Integer.toString(ReplacementTable.table[Integer.parseInt(sumString.substring(i, i + 1), 16)][i], 16);
    }
 
    BigInteger result = new BigInteger(newSumString, 16);
 
    return shift(result);
}
 
private BigInteger shift(BigInteger number)
{
    StringBuilder sb = new StringBuilder(number.toString(2));
 
    while (sb.toString().length() < 32)
        sb.insert(0, '0');
    for (int i = 0; i < 11; i++)
    {
        sb.append(sb.charAt(0));
        sb.deleteCharAt(0);     
    }
 
    String afterShift = sb.toString();
 
    return new BigInteger(afterShift, 2);
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.01.2017, 18:30
Ответы с готовыми решениями:

Программирование ГОСТ 28147-89
Пишу методичку по Защите и Безопасности Информации (вот, такая вот тяжелая судьба :-) ). И застрял на ГОСТ 28147-89. Весь стандарт целиком...

ГОСТ 28147
В этом госте описывается основной шаг криптопреобразования: S = (N1 + X) mod (2^32)!!! Вопрос в чём, 2^32 = 4.294.967.296 .... но вот с...

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

3
0 / 0 / 2
Регистрация: 09.06.2014
Сообщений: 14
17.01.2017, 12:56  [ТС]
Ошибся при делении ключа на 8 частей и при использовании таблицы замен. Необходимо было начинать заменять с конца строки.
ГОСТ 28147-89 в режиме простой замены. Алгоритм.
K – ключ.
A – младшие биты.
B – старшие биты.
Ключ K разбивается на 8 ключей, причём K = {K8, K7, K6, K5, K4, K3, K2, K1}.
A складывается с одним из 8 получившихся ключей по модулю 2 в степени 32.
Получаем S = (A + Ki) mod 2^32.
Полученное S разбивается на 8 частей, причём S = {S8, S7, S6, S5, S4, S3, S2, S1}.
Далее полученные 4-х битные символы преобразуются при помощи таблицы замен.
Первым идёт S1, получается S1’, затем S2, получается S2’ и так далее.
После этой операции получаем S’ = {S8’, S7’, S6’, S5’, S4’, S3’, S2’, S1’}.
Далее полученное S’ циклически сдвигаем влево на 11 бит, получаем R.
Теперь, применяя операцию XOR, получим результат шага:
RESULT = R XOR B.
Производим перестановку:
B = A,
A = RESULT.
В цикле 32 шага. Первые 24 шага ключи подаются в порядке K1, K2, K3, K4, K5, K6, K7, K8, K1, K2, K3, K4, K5, K6, K7, K8, K1, K2, K3, K4, K5, K6, K7, K8 . С шага 25 по 32 ключи подаются в обратном порядке: K8, K7, K6, K5, K4, K3, K2, K1.
После 32 шагов результат склеивается следующим образом – сначала идут младшие биты A, затем старшие биты B.

Подробный пример первого шага цикла.
K = 73 3d 2c 20 65 68 65 73 74 74 67 69 79 67 61 20 62 6e 73 73 20 65 73 69 32 6c 65 68 33 20 6d 54, шифрую 00 00 00 00 00 00 00 00. В начале разбиваю текст на две половины: B = 00 00 00 00 и A = 00 00 00 00 и ключ на 8 частей:
K8 = 73 3d 2c 20,
K7 = 65 68 65 73,
K6 = 74 74 67 69,
K5 = 79 67 61 20,
K4 = 62 6e 73 73,
K3 = 20 65 73 69,
K2 = 32 6c 65 68,
K1 = 33 20 6d 54.
Затем складываю A с K1 по модулю 2 в 32 степени, получаю 33 20 6d 54. В качестве таблицы замен использую таблицу замен ЦБ РФ:
{4, e, 5, 7, 6, 4, d, 1},
{a, b, 8, d, c, b, b, f},
{9, 4, 1, a, 7, a, 4, d},
{2, c, d, 1, 1, 0, 1, 0},
{d, 6, a, 0, 5, 7, 3, 5},
{8, d, 3, 8, f, 2, f, 7},
{0, f, 4, 9, d, 1, 5, a},
{e, a, 2, f, 8, d, 9, 4},
{6, 2, e, e, 4, 3, 0, 9},
{b, 3, f, 4, a, 6, a, 2},
{1, 8, c, 6, 9, 8, e, 3},
{c, 1, 7, c, e, 5, 7, e},
{7, 0, 6, b, 0, 9, 6, 6},
{f, 7, 0, 2, 3, c, 8, b},
{5, 5, 9, 5, b, f, 2, 8},
{3, 9, b, 3, 2, e, c, c}.
4 заменяю на d, 5 на d, d на 0, 6 на 9, 0 на 6, 2 на a, 3 на 1, 3 на 0
Получаю 01 a6 90 dd.
Циклический сдвиг влево на 11 бит даёт: 34 86 e8 0d
Далее полученный результат XOR B и получаю 34 86 e8 0d
Теперь
B = A = 00 00 00 00
A = 34 86 e8 0d

Результат 32 шагов будет
42 ab bc ce 32 bc 0b 1b
0
1 / 1 / 0
Регистрация: 06.05.2014
Сообщений: 84
18.01.2017, 09:58
код совсем свежий и рабочий, описывается только базовый шаг в коде, разбиение ключа уже вижу понял, не забудь про особенность сети Фейстеля, на последнем цикле A и B не меняются
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
void basic_step_GOST_28147_89(unsigned char Key[],unsigned char Tab_Z[][16],unsigned char message[]){
    setlocale(LC_ALL,"Russian");
    //A=message[0..3]
    //B=message[4..7]
    unsigned char A[4]={message[0],message[1],message[2],message[3]};
    unsigned char B[4]={message[4],message[5],message[6],message[7]};
    //1 step
    //S=(A+X) mod 2^32
    
 
    int Sum= *((int*)A)+*((int*)Key);
    //memcpy(&Sum,A,sizeof(int));
    for(int i=0;i<4;i++){
        A[i] = (Sum >> i*8)  & 0xff;
    }
    
 
    //2 step
    //поблочная замена
    
    unsigned char first_byte=0,second_byte=0,zam_symbol=0;
    
    for(int i=0;i<4;i++){
        first_byte = (A[i]& 0xF0)>>4 ;
        second_byte = A[i] & 0x0F;
 
        
 
        first_byte = Tab_Z[2*i+1][first_byte];
        second_byte = Tab_Z[2*i][second_byte];
 
        zam_symbol = (first_byte << 4) | second_byte;
        A[i]=zam_symbol;
        
    }
 
    //3
    //циклический сдвиг на 11
    Sum= (*((int*)A)<<11)|(*((int*)A)>>21); // циклический сдвиг на 11
    
    //4
    //S=S^B
    
 
    Sum=*((int*)B)^Sum;
    
    //5
    //B=A, A=S
    for(int i=0;i<4;i++){
        message[4+i]=message[i]; // B=A
        message[i]=(Sum >> i*8)  & 0xff;//A=S
        
    }
 
 
    
}
Добавлено через 7 минут
Я бы не советовал бы операться на источники, в которых не предусмотрены особенности перевода строки в число и обратно, это был косяк у меня, я написал прогу и просто вывел все данные, но данными, которые получил ручками на листочке, не совпадали.
1
0 / 0 / 2
Регистрация: 09.06.2014
Сообщений: 14
18.01.2017, 13:45  [ТС]
Спасибо) Я расписал шаг, чтобы было наглядно видно, что за чем идёт) Посчитано ни в коем случае не на листочке)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.01.2017, 13:45
Помогаю со студенческими работами здесь

Криптопровайдер ГОСТ 28147 - 89
Доброго времени! Никто не встречал готовую реализацию ГОСТ 28147 - 89?! Именно такую, чтобы для шифрования достаточно 1 вызова ...

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

Шифрование ГОСТ 28147–89
Разработайте программу, имитирующую реализацию элементов метода криптографической защиты информации в соответствии с ГОСТ 28147–89....

Шифрование ГОСТ 28147-89
Здравствуйте. Понадобилось реализовать шифрование ГОСТ на C - хотя бы простую замену. Опираясь на теорию http://gostshifr.narod.ru/vin.pdf...

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru