0 / 0 / 0
Регистрация: 08.06.2021
Сообщений: 3
1

Шифр ГОСТ 28147-89. Не получается расшифровать данные

17.07.2022, 19:44. Показов 1011. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго дня уважаемые!
Есть задание реализовать шифр по ГОСТ 28147-89, дано описание и несколько строк псевдокода. Вот я тут набросал код который шифрует и дешифрует строку, но он не работает. Не удается расшифровать данные. Может кто сталкивался с таким шифром, посмотрите пож в чем может быть дело? Любая помощь будет очень ценна.

C++ (Qt)
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
#include <iostream>
#include <Windows.h>
#include <string>
#include <iomanip>
#include <cmath>
using namespace std;
 
void Shifr(unsigned int& L, unsigned int& R, unsigned int S[][16], unsigned int W[]) {
    for (unsigned int v = 0; v < 32; v++) {
 
        unsigned int k = R + W[v], KeyEncrypt = 0;
        for (unsigned int j = 0; j < 8; j++) {
            KeyEncrypt |= S[j][k & 0b1111];
            KeyEncrypt <<= 4;
            k >>= 4;
        }
        KeyEncrypt = (KeyEncrypt << 11) | (KeyEncrypt >> (32 - 11));
        L ^= KeyEncrypt;
        swap(L, R);
    }
}
 
unsigned int main() {
 
    // -------------------------------------------  1 слово = 4 Байт = 32 Бит
    unsigned int K[8]{};                                // 8  слов = 32 Байт = 256 Бит
    unsigned int W[32]{};                           // 32 слова = 128 Байт = 1024 Бит
 
    char key[] = "_*Oz7&@#98+9$+_63893&-$)yerdg";
    char msg[] = "2022, hello world and by world ;)";
    char EncryptMsg[size(msg)]{};
    char DecryptMsg[size(msg)]{};
    unsigned int TempKey[8]{};
 
    srand(77);
    unsigned int S[8][16]{};
    for (unsigned int i = 0; i < 8; i++) {
        for (unsigned int j = 0; j < 16; j++) {
            S[i][j] = rand() % 16;
        }
    }
    unsigned int CountByte = strlen(key) < 32 ? strlen(key) : 32;
    memcpy(K, key, CountByte);                              // копируем числовые коды первых 32 символов в ключ
 
    memcpy(TempKey, K, 32);
    for (unsigned int i = 0; i < 32; i += 8) {
        if (i == 24) 
            reverse(begin(TempKey), end(TempKey));
        memcpy(W + i, TempKey, 32);
    }
 
    for (unsigned int i = 0; i < strlen(msg); i += 8) {
        unsigned int X[2]{};                                    // блок 8 символов
        CountByte = strlen(msg + i) < 8 ? strlen(msg + i) : 8;
        memcpy(X, msg+i, CountByte);
 
        unsigned int L = X[0], R = X[1];
 
//----------------------------------------------------------------
        Shifr(L, R, S, W);
//----------------------------------------------------------------
        unsigned int Y[2]{};
        memcpy(Y, &L, 4);
        memcpy(Y + 1, &R, 4);
        memcpy(EncryptMsg + i, Y, CountByte);
 
        //cout << i << ", " << EncryptMsg << strlen(EncryptMsg) << endl;
    }
    cout << EncryptMsg << endl;
    
//----------------------------------------------------------------
//------------------------------------------------------ Decripted
    reverse(begin(TempKey), end(TempKey));
    for (unsigned int i = 0; i < 32; i += 8) {
        if (i == 8) 
            reverse(begin(TempKey), end(TempKey));
        memcpy(W + i, TempKey, 32);
    }
 
    for (unsigned int i = 0; i < strlen(EncryptMsg); i += 8) {
        unsigned int X[2]{};
        unsigned int CountByte = strlen(EncryptMsg + i) < 8 ? strlen(EncryptMsg + i) : 8;
        memcpy(X, EncryptMsg + i, CountByte);
 
        unsigned int L = X[0], R = X[1];
//--------------------------------------------------
        Shifr(L, R, S, W);
//--------------------------------------------------
        unsigned int Y[2]{};
        memcpy(Y, &L, 4);
        memcpy(Y + 1, &R, 4);
        memcpy(DecryptMsg + i, Y, CountByte);
    }
    cout << DecryptMsg << endl;
    
    return 0;
}
0
17.07.2022, 19:44
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.07.2022, 19:44
Ответы с готовыми решениями:

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

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

Шифр замены по ГОСТ 28147-89
Размер таблицы 8х4, ключ задается пользователем, шифрограмма разбивается на группы с заданным количеством символов. Помогите пожалуйста...

1
случайный прохожий
 Аватар для gunslinger
3126 / 2127 / 632
Регистрация: 20.07.2013
Сообщений: 5,721
18.07.2022, 00:01 2
Алгоритм криптографического преобразования данных ГОСТ 28147-89: https://emkelektron.webnode.pa... -28147-89/.
Ещё раз о шифровании ГОСТ 28147-89: https://habr.com/ru/post/256843/.
По второму адресу есть ссылка на сишную реализацию алгоритма: https://github.com/sftp/gost28147.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.07.2022, 00:01
Помогаю со студенческими работами здесь

Как расшифровать сообщение по алгоритму ГОСТ 28147-89?
Друзья! Я написал программу, которая реализует шифрование. Сверился с этим документом. Теперь нужно реализовать расшифровку, и прежде,...

Почему не правильно работает шифр ГОСТ 28147-89 в режиме простой замены
Написал программку шифрующее текстовое сообщение шифр ГОСТ только без сдвига 11 битов в функции Фейстеля.Вроде как шифрует но делаю...

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

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

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Опции темы

Новые блоги и статьи
Ошибка Docker "Got permission denied while trying to connect to the Docker daemon socket at"
hw_wired 14.02.2025
Разработка с использованием Docker может иногда преподносить неожиданные сюрпризы, и одним из самых распространенных камней преткновения становится ошибка с отказом в доступе к демону Docker. . . .
Ошибка "No 'Access-Control-Allow-Origin' header is present on the requested resource"
hw_wired 14.02.2025
При разработке современных веб-приложений нередко сталкиваешься с ошибкой "No 'Access-Control-Allow-Origin' header is present on the requested resource". Эта проблема возникает из-за политики. . .
Как закрыть порт в Linux
hw_wired 14.02.2025
Управление сетевыми портами в Linux - непростая, но важная задача для обеспечения безопасности системы. Каждый открытый порт - это потенциальная уязвимость, через которую злоумышленики могут. . .
Ошибка Angular "Can't bind to 'taskForm' since it isn't a known property of 'form'"
hw_wired 14.02.2025
При разработке веб-приложений на Angular можно столкнуться с ошибкой "Can't bind to '' since it isn't a known property of 'form'". Эта ошибка появляется в консоли браузера когда мы пытаемся. . .
Сообщение Git "Pulling without specifying how to reconcile divergent branches is discouraged"
hw_wired 14.02.2025
При работе с системой контроля версий Git многие разработчики сталкиваются с предупреждающим сообщением "Pulling without specifying how to reconcile divergent branches is discouraged". Это. . .
Как настроить количество пробелов в отступах табов в Visual Studio Code
hw_wired 14.02.2025
Visual Studio Code предоставляет несколько гибких способов настройки табуляции, каждый из которых имеет свои преимущества. Самый простой и наглядный метод - через графический интерфейс настроек, где. . .
Что означает знак восклицания в TypeScript
hw_wired 14.02.2025
TypeScript - удивительный язык программирования, который предоставляет множество возможностей для работы с типами данных. Особый интерес вызывает оператор утверждения ненулевого значения, который. . .
Как свернуть/скрыть секции кода в Visual Studio Code
hw_wired 14.02.2025
Ежедневно мы работам с файлами, содержащими сотни и тысячи строк кода. Навигация по такому объему становится настоящим испытанием, особенно когда нужно быстро найти нужный метод или переменную. . . .
Автоматическое создание файла requirements.tx­t в Python
hw_wired 14.02.2025
Дружелюбная среда для разработки на Python, один из самых широко используемых языков программирования, состоит не только из самого кода, но и целого ряда важных компонентов. И если вы когда-нибудь. . .
Передача переменных окружения в контейнер Docker
hw_wired 14.02.2025
При работе с Docker контейнерами возникает необходимость передать различные настройки и конфигурационные параметры - от строк подключения к базам данных до API ключей. И хотя можно жестко прописать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru