P
Poloz
Здравствуйте. Очень нужна помощь в написании курсовой работы на тему "Расчет S-блоков алгоритма ГОСТ 28147-89"
1. алгоритмом ГОСТ зашифровано сообщение (с помощью определенного S-блока). у нас есть только само это сообщение вида
2115959972 1097468422
926583362 511606919
2540269021 462145303
3944088823 962858646
1378309145 185548767
184384886 723230571
758674860 153732082
235924252 3413274775
2101168336 4091192498
1604482021 1434320407
Задача - по данному шифрованному тексту нужно вычислить s-блок которым было зашифровано сообщение. Результат - S-блок.
Существует алгоритм криптоанализа:
1. Берется очередной блок замены, на вход которого поступает n бит.
2. В таблице анализа для данного блока замены все исходные значения полагаются равными 0.
3. Определяется первое возможное значение входной разности ∆А=0.
4. Определяется значение первого входа Х=0 в анализируемый S-блок.
5. Вычисляется второе значение входа Х’ = Х % ∆А.
6. Для входов Х и Х’ в соответствии с принципом работы S-блока определяются соответственно выходы Y и Y’.
7. Вычисляется значение выходной разности ∆С = Y % Y’.
8. В таблице анализа увеличивается на 1 значение, стоящее на пересечении строки с номером ∆А и столбца с номером ∆С.
9. Значение Х увеличивается на 1.
10. Если Х<2n, то происходит переход к пункту 5.
11. Значение ∆А увеличивается на 1.
12. Если ∆А < 2n, то происходит переход к пункту 4.
13. Если не все блоки замены проанализированы, то происходит переход к пункту 1, иначе алгоритм заканчивает свою работу.
я уже давно бъюсь с кодом.. вот какой он у меня
мой код не работает..не считывает файл.
input.txt - это файл в котором хранится зашифрованное сообщение, а s_box.txt - это файл в который нужно записать результат.
Должен получиться S-блок вот такой вот
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
1. алгоритмом ГОСТ зашифровано сообщение (с помощью определенного S-блока). у нас есть только само это сообщение вида
2115959972 1097468422
926583362 511606919
2540269021 462145303
3944088823 962858646
1378309145 185548767
184384886 723230571
758674860 153732082
235924252 3413274775
2101168336 4091192498
1604482021 1434320407
Задача - по данному шифрованному тексту нужно вычислить s-блок которым было зашифровано сообщение. Результат - S-блок.
Существует алгоритм криптоанализа:
1. Берется очередной блок замены, на вход которого поступает n бит.
2. В таблице анализа для данного блока замены все исходные значения полагаются равными 0.
3. Определяется первое возможное значение входной разности ∆А=0.
4. Определяется значение первого входа Х=0 в анализируемый S-блок.
5. Вычисляется второе значение входа Х’ = Х % ∆А.
6. Для входов Х и Х’ в соответствии с принципом работы S-блока определяются соответственно выходы Y и Y’.
7. Вычисляется значение выходной разности ∆С = Y % Y’.
8. В таблице анализа увеличивается на 1 значение, стоящее на пересечении строки с номером ∆А и столбца с номером ∆С.
9. Значение Х увеличивается на 1.
10. Если Х<2n, то происходит переход к пункту 5.
11. Значение ∆А увеличивается на 1.
12. Если ∆А < 2n, то происходит переход к пункту 4.
13. Если не все блоки замены проанализированы, то происходит переход к пункту 1, иначе алгоритм заканчивает свою работу.
я уже давно бъюсь с кодом.. вот какой он у меня
C++:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <windows.h>
#include <math.h>
#include <fstream>
/* Для использования потокового ввода/вывода */
using namespace std;
/* Чтобы не писать каждый раз unsigned int переименовываем в word32 */
typedef unsigned int word32;
word32 RaznA;
word32 RaznC;
int n;
word32 x, x1, y, y2;
word32 in[2];
// таблица анализа блока замены (равна нулю)
static unsigned char analiz [8][16] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
void s_box (word32 const in[2])
{ //файл в который будет записан результат поиска значений S-блока
FILE *s;
s = fopen ("s_box.txt","w");
//файл только для чтения. в нем хранится зашифрованное сообщение
FILE *f;
f = fopen ("input.txt", "r");
/* таблица анализа блока замены (равна нулю)
static unsigned char analiz [8][16] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};*/
for (int count = 1; count < 129; count++)
{
/*построчное считывание в переменную stroka из файла с зашифрованными сообщениями*/
char ciphertext[22];
char *stroka;
FILE *input;
stroka = fgets(ciphertext, 22, f);
register word32 n1, n2;
n1 = in [0]; /* Младшая часть */
n2 = in [1]; /* Старшая часть */
// ?А.
RaznA = 0;
//Если ?А < 2n, то происходит переход к пункту 4.
for (RaznA = 0; RaznA < pow((double)2,n);RaznA++)
{
{
x = 0;
y = analiz [7][x >> 28 & 15] << 28 |
analiz [6][x >> 24 & 15] << 24 |
analiz [5][x >> 20 & 15] << 20 |
analiz [4][x >> 16 & 15] << 16 |
analiz [3][x >> 12 & 15] << 12 |
analiz [2][x >> 8 & 15] << 8 |
analiz [1][x >> 4 & 15] << 4 |
analiz [0][x & 15];
}
//Если Х<2n, то происходит переход к пункту 5.
for (x = 0; x < pow((double)2,n); x++)
{
x1= x % RaznA;
y2 = analiz [7][x1 >> 28 & 15] << 28 |
analiz [6][x1 >> 24 & 15] << 24 |
analiz [5][x1 >> 20 & 15] << 20 |
analiz [4][x1 >> 16 & 15] << 16 |
analiz [3][x1 >> 12 & 15] << 12 |
analiz [2][x1 >> 8 & 15] << 8 |
analiz [1][x1 >> 4 & 15] << 4 |
analiz [0][x1 & 15];
RaznC = y % y2;
//В таблице анализа увеличивается на 1 значение, стоящее на пересечении
//строки с номером ?А и столбца с номером ?С.
analiz [RaznA][RaznC]+=1;
x = x + 1;
}
}
}
//вывод результата в файл
//fprintf (s, "%d", analiz[8][16]);
}
void main ()
{
int i=1;
FILE *input;
input = fopen("input.txt","a");
for(i=1;i<9;i++)
{
static unsigned char temp [8][2];
} char sentence[25];
fgets(sentence,25,stdin);
s_box();
FILE *s;
s=fopen("s_box.txt","a");
fputs(sentence,s);
return 0;
}
мой код не работает..не считывает файл.
input.txt - это файл в котором хранится зашифрованное сообщение, а s_box.txt - это файл в который нужно записать результат.
Должен получиться S-блок вот такой вот
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