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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Ожидание файла (постоянное) http://www.cyberforum.ru/cpp-beginners/thread680736.html
есть пустая папка, как только в папку ложится(попадает) файл, программа должна начать его обработку. Обработка написана, а как сделать ожидание файла в папке, и как узнать скопировался он полностью в папку или ещё не полностью.
C++ Сортировка слов по алфавиту слова из файла с пробелами я считал, теперь надо отсортировать в алфавитном порядке (сравнить каждое с каждым словом от пробела до пробела) и с записать в столбик... Как реализовать вообще непонимаю =( http://www.cyberforum.ru/cpp-beginners/thread680731.html
Консольный морской бой. Расстановка кораблей C++
Добрый вечер, уважаемые форумчане. Хочу написать консольный морской бой. Начал с функции автоматической расстановки кораблей. Весь день не получается найти где спяталась ошибка в моем коде. Иногда программа зависает в 193-195 строках. Я новичек и не совсем еще разобрался в отладке программ. Использую VS 2010. #include <iostream> #include <time.h> #include <conio.h> using namespace std;
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  [ТС]     AES. Расшифровка
переписал алгоритм шифрования, написал алгоритм дешифрования. Но не получилось. Что-то где то не так. Прозреваю ошибку в функции 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 минут
Вверх
 
Текущее время: 11:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru