Форум программистов, компьютерный форум, киберфорум
Наши страницы

AES. Расшифровка - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Ожидание файла (постоянное) http://www.cyberforum.ru/cpp-beginners/thread680736.html
есть пустая папка, как только в папку ложится(попадает) файл, программа должна начать его обработку. Обработка написана, а как сделать ожидание файла в папке, и как узнать скопировался он полностью в...
C++ Сортировка слов по алфавиту слова из файла с пробелами я считал, теперь надо отсортировать в алфавитном порядке (сравнить каждое с каждым словом от пробела до пробела) и с записать в столбик... Как реализовать вообще непонимаю... http://www.cyberforum.ru/cpp-beginners/thread680731.html
Консольный морской бой. Расстановка кораблей C++
Добрый вечер, уважаемые форумчане. Хочу написать консольный морской бой. Начал с функции автоматической расстановки кораблей. Весь день не получается найти где спяталась ошибка в моем коде. ...
C++ Даны массивы целых чисел A[25] и B[25]
Даны массивы целых чисел A и B.Сформировать третий массив, в который включить все положительные элементы обоих массивов, меньших 10. Нужно решить в C++.
C++ Конечный автомат http://www.cyberforum.ru/cpp-beginners/thread680716.html
Здравствуйте! Возникли проблемы с задачей: дан набор правил q0 -> aq1, q1 -> bq2, q1 -> q2, q1 -> cq2, q2 -> aq3 и др. Нужно написать программу, которая считывает количество символов в слове и...
C++ не отображается робота программы Начал изучать С++, и сталкиваюсь каждый раз с новыми проблемами в изучении.. Вот уже книгу нашел подходящую(Брюс Эккель - Филосовия С++ 1 том) но опять же столкнулся с проблемой вывода роботы... подробнее

Показать сообщение отдельно
Crait
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 32
31.10.2012, 23:47  [ТС]
переписал алгоритм шифрования, написал алгоритм дешифрования. Но не получилось. Что-то где то не так. Прозреваю ошибку в функции mix_columns. Пожалуйста, скажите, что я сделал не так.
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
void inv_sub_bytes(unsigned char* state) {
  int i;
  for(i = 0; i < AES_BLOCK_SIZE; i++)
    state[i] = aes_invsbox[state[i]];
}
 
/* перестановка строк матрицы */
void inv_shift_rows(unsigned char* state) {
   unsigned char t = state[7];
 
  /* вторая строка */
  state[7] = state[6];
  state[6] = state[5];
  state[5] = state[4];
  state[4] = t;
  for (int i =0;i<3;i++)
  {
  /* третья строка */
  t = state[11];
  state[11] = state[10];
  state[10] = state[9];
  state[9] = state[8];
  state[8] = t;
  }
  for ( int i = 0; i<4;i++)
  {
 
  /* четвертая строка */
  t = state[15];
  state[15] = state[14];
  state[14] = state[13];
  state[13] = state[12];
  state[12] = t;
  }
}
void inv_mix_columns(unsigned char* state)
{
      unsigned char t[4];
  int i;
 
  for(i = 0; i < 4; i++) { /* для каждого столбца */
    t[0] = state[(i << 2)];
    t[1] = state[(i << 2)+1];
    t[2] = state[(i << 2)+2];
    t[3] = state[(i << 2)+3];
   
    /* первый элемент */
     state[i << 2] = (14*t[0])^(11*t[1])^(13*t[2])^(9*t[3]);
     state[(i << 2)+1] = (9*t[0])^(14*t[1])^(11*t[2])^(13*t[3]);
     state[(i << 2)+2] = (13*t[0])^(9*t[1])^(14*t[2])^(11*t[3]);
     state[(i << 2)+3] = (11*t[0])^(13*t[1])^(9*t[2])^(14*t[3]);
 
   
  }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void aes_decrypt(struct aes_key* exp_key, unsigned char* inbuff,unsigned char* outbuff)
{
    
    int i, delta =0;
     for(i = 0; i < AES_BLOCK_SIZE; i++)
    outbuff[i] = inbuff[i];
    add_round_key(exp_key,outbuff,&delta);
    for (i=AES_ROUNDS-1;i>1;i--)
    {
        inv_shift_rows(outbuff);
        inv_sub_bytes(outbuff);
        add_round_key(exp_key,outbuff,&delta);
        inv_mix_columns(outbuff);
    }
    inv_shift_rows(outbuff);
    inv_sub_bytes(outbuff);
    add_round_key(exp_key,outbuff,&delta);
 
}
Это было дешифрование. А вот шифрование
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
void aes_sub_bytes(unsigned char* state) {
  int i;
  for(i = 0; i < AES_BLOCK_SIZE; i++)
    state[i] = aes_sbox[state[i]];
}
 
/* перестановка строк матрицы */
void aes_shift_rows(unsigned char* state) {
  unsigned char t = state[4];
 
  /* вторая строка */
  state[4] = state[5];
  state[5] = state[6];
  state[6] = state[7];
  state[7] = t;
  for ( int i =0; i<3;i++)
  {
        /* третья строка */
  t = state[8];
  state[8] = state[9];
  state[9] = state[10];
  state[10] = state[11];
  state[11] = t;
  }
  for (int i = 0; i<4;i++)
  {
  /* четвертая строка */
  t = state[12];
  state[12] = state[13];
  state[13] = state[14];
  state[14] = state[15];
  state[15] = t;
  }
}
 
/* перемешивание столбцов */
void aes_mix_columns(unsigned char* state) {
      unsigned char t[4];
  int i;
 
  for(i = 0; i < 4; i++) { /* для каждого столбца */
    t[0] = state[(i << 2)];
    t[1] = state[(i << 2)+1];
    t[2] = state[(i << 2)+2];
    t[3] = state[(i << 2)+3];
   
    /* первый элемент */
     state[i << 2] = (2*t[0])^(3*t[1])^(t[2])^(t[3]);
     state[(i << 2)+1] = (t[0])^(2*t[1])^(3*t[2])^(t[3]);
     state[(i << 2)+2] = (t[0])^(t[1])^(2*t[2])^(3*t[3]);
     state[(i << 2)+3] = (3*t[0])^(t[1])^(t[2])^(2*t[3]);
 
   
  }
}
 
/* сложение с ключом */
void aes_add_round_key(struct aes_key* key, unsigned char* state, int* delta) {
  int i, t = *delta; 
  for(i = 0; i < AES_BLOCK_SIZE; i++)
    state[i] ^= key->k[t++];
  *delta = t; 
}
 
/* шифруем 16-и байтный блок данных с заданным ключом */
void aes_encrypt(struct aes_key* exp_key,
                 unsigned char* inbuff,
                 unsigned char* outbuff) {
  int i, delta = 0;
 
  /* копируем состояние */
  for(i = 0; i < AES_BLOCK_SIZE; i++)
    outbuff[i] = inbuff[i];
 
  aes_add_round_key(exp_key, outbuff, &delta);
 
  /* основные итерации */
  for(i = 0; i < AES_ROUNDS - 1; i++) {
    aes_sub_bytes(outbuff);
    aes_shift_rows(outbuff);
    aes_mix_columns(outbuff);
    aes_add_round_key(exp_key, outbuff, &delta);
  }
 
  /* final round */
  aes_sub_bytes(outbuff);
  aes_shift_rows(outbuff);
  aes_add_round_key(exp_key, outbuff, &delta);
}
Добавлено через 4 часа 27 минут
Вверх
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru