Форум программистов, компьютерный форум CyberForum.ru

ГОСТ 28147-89 режим простой замены - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Двумерный массив в одномерный http://www.cyberforum.ru/cpp-beginners/thread866049.html
Задача: двумерный массив N*N преобразовать в одномерный N2. По особому алгоритму( приложения) Собственно код написал(пишу для c++ borland) #include <iostream.h> #include <conio.h> #include <stdlib.h> void main() { int i,j,k,q,N,M,L,x;
C++ В каждом слове заменить первую букву на прописную Дана строка символов, состоящая из произвольного текста, слова разделены пробелами. В каждом слове заменить первую букву на прописную.Использовать тип (класс) string. string task3(string s,string s1) { int pos=1,len=0,i; len=s.length(); s=char(int(s)-32); for (i=0;i<len;i++) http://www.cyberforum.ru/cpp-beginners/thread866026.html
Строки: заменить каждый символ '/' на пару символов ':' C++
Подсчитать количество пар '23' и '45' по отдельности и заменить каждый символ '/' на пару символов ': '. С использование библиотеки string.h void task1(char *s, int &kol1, int &kol2) { char *r; char a; r=s; while((r=strstr(r,"23"))!=0) { kol1++;
C++ Посоветуйте книжку по С++
В общем знаю С++ на уровне создания консольных приложений под windows, хотелось бы научиться программировать с использованием winapi и создавать пользовательские интерфейсы как в visual basic-е. В какой книжке это можно почитать? А то в гугле их столько, что глаза разбегаются, не знаешь за что хвататься.
C++ Разбиение множества http://www.cyberforum.ru/cpp-beginners/thread865998.html
срочно нужно решить, помогите пжл. Даются пары элементов и расстояния между ними, разбить множество элементов на классы так чтобы для любой пары из класса расстояние между ними была заданному числу(вместо элементов я обозначаю их номера). Пример : 1 2 1 1 3 1 1 4 1 2 3 1 2 4 1
C++ Написать функцию, которая выводит строку, состоящую из одинаковых символов 1.Написать функцию, которая выводит строку, состоящую из одинаковых символов. Длина строки и символ являются параметрами функции. подробнее

Показать сообщение отдельно
genock94
 Аватар для genock94
19 / 19 / 1
Регистрация: 16.11.2012
Сообщений: 348
15.05.2013, 17:07     ГОСТ 28147-89 режим простой замены
Добрый день, уважаемые формучане.
Решил написать программу, которая реализует ГОСТ в режиме простой замены. Вот код:
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
// 212.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include "conio.h"
 
long pow(int a, int b);
long filesize(FILE *stream);
 
    FILE *fi=fopen("C:\\example\\1.txt","rb");
    FILE *fo=fopen("C:\\example\\2.txt","wb");
    int T[64],c[8],A[32],B[32],C[32],K[32],SUM32[32];
    int N[8]={0,0,0,0,0,0,0,0},N1[32],F[32];
    long KEY[8]={1,2,3,4,5,6,7,8};
    char ch;
    int n,blokN,vib;
    long size;
    bool nekratno=0;
 
    int TABLE[8][16]=
    { 
      4, 10,  9,  2, 13,  8,  0, 14,  6, 11,  1, 12,  7, 15,  5,  3,
     14, 11,  4, 12,  6, 13, 15, 10,  2,  3,  8,  1,  0,  7,  5,  9,
      5,  8,  1, 13, 10,  3,  4,  2, 14, 15, 12,  7,  6,  0,  9, 11,
      7, 13, 10,  1,  0,  8,  9, 15, 14,  4,  6, 12, 11,  2,  5,  3,
      6, 12,  7,  1,  5, 15, 13,  8,  4, 10,  9, 14,  0,  3, 11,  2,
      4, 11, 10,  0,  7,  2,  1, 13,  3,  6,  8,  5,  9, 12, 15, 14,
     13, 11,  4,  1,  3, 15,  5,  9,  0, 10, 14,  7,  6,  8,  2, 12,
      1, 15, 13,  0,  5,  7, 10,  4,  9,  2,  3, 14,  6, 11,  8, 12
    };
 
int main()
{
    //Определение числа блоков
    size=filesize(fi);
    blokN=size/8;
        if(size%8!=0)
        {
            blokN++;
            nekratno=1;
        }
//Заполнение блока Т
    for(int p=0;p<blokN;p++)
    {
        if((p==blokN-1)&&(nekratno==1))
        {
            for(int i=0;i<size%8;i++)
            {
                ch=fgetc(fi);
                n=ch;
                for(int j=0;j<8;j++)
                {
                    if(n/pow(2,7-j)>=1)
                    {
                        T[8*i+j]=1;
                        n=n-pow(2,7-j);
                    }
                    else
                        T[8*i+j]=0;
                }
            }
            for(int i=8*size;i<64;i++)
                T[i]=0;
        }
        else
        {
            for(int i=0;i<8;i++)
            {
                ch=fgetc(fi);
                n=ch;
                for(int j=0;j<8;j++)
                {
                    if(n/pow(2,7-j)>=1)
                    {
                        T[8*i+j]=1;
                        n=n-pow(2,7-j);
                    }
                    else
                        T[8*i+j]=0;
                }
            }
        }
        for(int i=0;i<32;i++)
        {
            B[i]=T[i];
        }
        for(int i=0;i<32;i++)
        {
            A[i]=T[32+i];
        }
        //Начало основного цикла:
        for (int t=1;t<=32;t++)
        {
            //Заполнение подключа K
                int x;
                if((t>=25)&&(t<=32))
                    x=KEY[7-(t-1)%8];
                else
                    x=KEY[(t-1)%8];
                for(int i=0;i<32;i++)
                {
                    if(x/pow(2,31-i)>=1)
                    {
                        K[i]=1;
                        x=x-pow(2,31-i);
                    }
                    else
                        K[i]=0;
                }
            //Функция Фейстеля:
            //1) Сумматор по модулю 2^32
                for(int c=0,i=31;i>=0;i--)
                {
                    if ((A[i]+K[i]+c)>=2)
                    {
                        SUM32[i]=A[i]+K[i]+c-2;
                        c=1;
                    }
                    else
                    {
                        SUM32[i]=A[i]+K[i]+c;
                        c=0;
                    }
                }
    
            //2) Заполнение накопителя
                for(int i=0;i<8;i++)
                {
                    for(int j=0;j<4;j++)
                    {
                        if(SUM32[31-4*i-j]==1)
                        {
                            N[i]=N[i]+pow(2,j);
                        }
                    }
                }
            //3) Проход через узлы замен
                for(int i=0,k;i<8;i++)
                {
                    k=N[i];
                    N[i]=TABLE[i][k];
                }
            //3) Заполнение выходного накопителя
                for(int i=0;i<8;i++)
                    for(int j=0;j<4;j++)
                    {
                        if(N[i]/pow(2,3-j)>=1)
                        {
                            N1[4*i+j]=1;
                            N[i]=N[i]-pow(2,3-j);
                        }
                        else
                            N1[4*i+j]=0;
                    }
            //4) Сдвиг на 11 битов влево
                for(int i=0;i<21;i++)
                {
                    F[i]=N1[i+11];
                }
                for(int i=0;i<11;i++)
                {
                    F[i+21]=N1[i];
                }
                //Сохраняем блок A в C
                for(int i=0;i<32;i++)
                    C[i]=A[i];
            //Двоичное исключающее "или" для Bi и F. Результат в Ai+1
                for(int i=0;i<32;i++)
                {
                    A[i]=F[i]^B[i];
                }
            //Сохраняем A1 в B2
                for(int i=0;i<32;i++)
                {
                    B[i]=C[i];
                }
        }
        //Конец основного цикла.
        //Склеивание блоков A33+B33
        for(int i=0;i<32;i++)
        {
            T[i]=A[i];
        }
        for(int i=32;i<64;i++)
        {
            T[i]=B[i-32];
        }
        //Вывод зашифрованного текста в выходной файл
        n=0;
        for(int i=0;i<8;i++)
        {
            for(int j=0;j<8;j++)
            {
                if (T[i+j]==1)
                    n=n+pow(2,j);               
            }
            ch=n;
            fprintf(fo,"%c",ch);
        }
    }
    printf("\n");
    getch();
    return 0;
}
 
//************************************************************************************
long pow(int a, int b)
{
    long rez=1;
    for(int k=1;k<=b;k++)
    {
        rez=rez*a;
    }
    return rez;
}
 
long filesize(FILE *stream)
{
 long curpos, length;
 curpos = ftell(stream);
 fseek(stream, 0L, SEEK_END);
 length = ftell(stream);
 fseek(stream, curpos, SEEK_SET);
 return length;
}
Для проверки программы я написал программу, которая дешифрует шифр-текст. Вот код:
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
// 212.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include "conio.h"
 
long pow(int a, int b);
long filesize(FILE *stream);
 
    FILE *fi=fopen("C:\\example\\1.txt","rb");
    FILE *fo=fopen("C:\\example\\2.txt","wb");
    int T[64],c[8],A[32],B[32],C[32],K[32],SUM32[32];
    int N[8]={0,0,0,0,0,0,0,0},N1[32],F[32];
    long KEY[8]={1,2,3,4,5,6,7,8};
    char ch;
    int n,blokN,vib;
    long size;
    bool nekratno=0;
 
    int TABLE[8][16]=
    { 
      4, 10,  9,  2, 13,  8,  0, 14,  6, 11,  1, 12,  7, 15,  5,  3,
     14, 11,  4, 12,  6, 13, 15, 10,  2,  3,  8,  1,  0,  7,  5,  9,
      5,  8,  1, 13, 10,  3,  4,  2, 14, 15, 12,  7,  6,  0,  9, 11,
      7, 13, 10,  1,  0,  8,  9, 15, 14,  4,  6, 12, 11,  2,  5,  3,
      6, 12,  7,  1,  5, 15, 13,  8,  4, 10,  9, 14,  0,  3, 11,  2,
      4, 11, 10,  0,  7,  2,  1, 13,  3,  6,  8,  5,  9, 12, 15, 14,
     13, 11,  4,  1,  3, 15,  5,  9,  0, 10, 14,  7,  6,  8,  2, 12,
      1, 15, 13,  0,  5,  7, 10,  4,  9,  2,  3, 14,  6, 11,  8, 12
    };
 
int main()
{
    //Определение числа блоков
    size=filesize(fi);
    blokN=size/8;
        if(size%8!=0)
        {
            blokN++;
            nekratno=1;
        }
//Заполнение блока Т
    for(int p=0;p<blokN;p++)
    {
        if((p==blokN-1)&&(nekratno==1))
        {
            for(int i=0;i<size%8;i++)
            {
                ch=fgetc(fi);
                n=ch;
                for(int j=0;j<8;j++)
                {
                    if(n/pow(2,7-j)>=1)
                    {
                        T[8*i+j]=1;
                        n=n-pow(2,7-j);
                    }
                    else
                        T[8*i+j]=0;
                }
            }
            for(int i=8*size;i<64;i++)
                T[i]=0;
        }
        else
        {
            for(int i=0;i<8;i++)
            {
                ch=fgetc(fi);
                n=ch;
                for(int j=0;j<8;j++)
                {
                    if(n/pow(2,7-j)>=1)
                    {
                        T[8*i+j]=1;
                        n=n-pow(2,7-j);
                    }
                    else
                        T[8*i+j]=0;
                }
            }
        }
        for(int i=0;i<32;i++)
        {
            B[i]=T[i];
        }
        for(int i=0;i<32;i++)
        {
            A[i]=T[32+i];
        }
        //Начало основного цикла:
        for (int t=1;t<=32;t++)
        {
            //Заполнение подключа K
                int x;
                if((t>=1)&&(t<=8))
                    x=KEY[t-1];
                else
                    x=KEY[7-(t-1)%8];
                for(int i=0;i<32;i++)
                {
                    if(x/pow(2,31-i)>=1)
                    {
                        K[i]=1;
                        x=x-pow(2,31-i);
                    }
                    else
                        K[i]=0;
                }
            //Функция Фейстеля:
            //1) Сумматор по модулю 2^32
                for(int c=0,i=31;i>=0;i--)
                {
                    if ((A[i]+K[i]+c)>=2)
                    {
                        SUM32[i]=A[i]+K[i]+c-2;
                        c=1;
                    }
                    else
                    {
                        SUM32[i]=A[i]+K[i]+c;
                        c=0;
                    }
                }
    
            //2) Заполнение накопителя
                for(int i=0;i<8;i++)
                {
                    for(int j=0;j<4;j++)
                    {
                        if(SUM32[31-4*i-j]==1)
                        {
                            N[i]=N[i]+pow(2,j);
                        }
                    }
                }
            //3) Проход через узлы замен
                for(int i=0,k;i<8;i++)
                {
                    k=N[i];
                    N[i]=TABLE[i][k];
                }
            //3) Заполнение выходного накопителя
                for(int i=0;i<8;i++)
                    for(int j=0;j<4;j++)
                    {
                        if(N[i]/pow(2,3-j)>=1)
                        {
                            N1[4*i+j]=1;
                            N[i]=N[i]-pow(2,3-j);
                        }
                        else
                            N1[4*i+j]=0;
                    }
            //4) Сдвиг на 11 битов влево
                for(int i=0;i<21;i++)
                {
                    F[i]=N1[i+11];
                }
                for(int i=0;i<11;i++)
                {
                    F[i+21]=N1[i];
                }
                //Сохраняем блок A в C
                for(int i=0;i<32;i++)
                    C[i]=A[i];
            //Двоичное исключающее "или" для Bi и F. Результат в Ai+1
                for(int i=0;i<32;i++)
                {
                    A[i]=F[i]^B[i];
                }
            //Сохраняем A1 в B2
                for(int i=0;i<32;i++)
                {
                    B[i]=C[i];
                }
        }
        //Конец основного цикла.
        //Склеивание блоков A33+B33
        for(int i=0;i<32;i++)
        {
            T[i]=A[i];
        }
        for(int i=32;i<64;i++)
        {
            T[i]=B[i-32];
        }
        //Вывод зашифрованного текста в выходной файл
        n=0;
        for(int i=0;i<8;i++)
        {
            for(int j=0;j<8;j++)
            {
                if (T[i+j]==1)
                    n=n+pow(2,j);               
            }
            ch=n;
            fprintf(fo,"%c",ch);
        }
    }
    printf("\n");
    getch();
    return 0;
}
 
//************************************************************************************
long pow(int a, int b)
{
    long rez=1;
    for(int k=1;k<=b;k++)
    {
        rez=rez*a;
    }
    return rez;
}
 
long filesize(FILE *stream)
{
 long curpos, length;
 curpos = ftell(stream);
 fseek(stream, 0L, SEEK_END);
 length = ftell(stream);
 fseek(stream, curpos, SEEK_SET);
 return length;
}
Однако после поочерёдного прогона обеих программ (сначала шифрование, потом дешифрование результата работы шифрования) исходный текст и дешифрованный не совпадают
Обе программы отличаются лишь порядком подключей.
Алгоритм реализовывал с википедии, так что возможно ошибка в алгоритме моих программ..
Пожалуйста, помогите найти ошибки((
Если появятся вопросы по коду программ, пожалуйста, задавайте их, и я на них отвечу.
Ах да.. еще кое-что.. Программа нацелена на реализацию ГОСТа, а не на красоту
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 00:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru