Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Crait
0 / 0 / 2
Регистрация: 26.09.2012
Сообщений: 32
#1

Цель - сделать AES с MD5 - C++

18.10.2012, 02:04. Просмотров 533. Ответов 0
Метки нет (Все метки)

Здравствуйте!
Цель - сделать AES с MD5, нашел алгоритм этой хэш функции, но почему-то он вылетает. Не подскажите, в чем дело?

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
void MD5_hash(string sIn, int A,int B,int C, int D)
{
int length=sIn.size(); //получаем длину входного сообщения.
int rests=length%64; //остаток от деления на 64байта.
int size=0; //тут будет храниться размер сообщения после первых 2ух шагов.
 
//Шаг 1.
if(rests < 56) //если остаток от деления на 64 меньше 56
 size=length-rests+56+8; //подгоняем размер так, что бы он был кратен 64(+8 байт для 2ого шага).
else //иначе (если остаток больше 56)
 size=length+64-rests+56+8; //подгоняем размер так, что бы он был кратен 64(+8 байт для 2ого шага).
 
unsigned char *cIn=new unsigned char[size]; //создаем динамический массив для хранения сообщения, которое далее будет кодироваться
 
for(int i=0;i<length;i++) //первые length элементов сIn
 cIn[i]=sIn[i+1]; //заполняем символами входного сообщения
 
cIn[length]=0x80; //савим в конец сообщения единичный бит.
 
for(int i=length+1;i<size;i++) //а все остальное
 cIn[i]=0; //заполняем нулями
 
//Шаг 2.
__int64 bitLength=(uint)(length)*8; //длина сообщения в битах.
 
for(int i=0;i<8;i++) //последние 8 байт
 cIn[size-8+i]=(bitLength >> i*8); //заполняем 64-битным представлением длины данных до выравнивания
 
//Шаг 3.
A=0x67452301, //Инициализируем начальные значения регистров.
B=0xefcdab89,
C=0x98badcfe,
D=0x10325476;
uint T[64]; //64-элементная таблица данных (констатнт).
 
for(int i=0;i<63;i++) //всю таблицу констант
 T[i]= pow(2.0,32.0)*fabs(sin(i*1.0)); //заполняем в соответствии с алгоритмом.
 
uint *X=new uint[size/4]; //создаем массив Х, в котором будет 32-разрядное представление сообщения.
 
X=(uint*)(cIn); //загоняем в массив Х сообщение cIn(в данном случае оно само разбиваеться на 32-разрядные слова).
 
//или это можно сделать "вручную" следующим образом:
//for(int i = 0; i <size/4; i++ )
 //X[ i] =(uint)(cIn[ i*4 + 3]<<24) +(uint)(cIn [i*4 + 2]<<16) + (uint)(cIn[i*4 + 1]<<8) + (uint)(cIn [i*4 + 0]);
 
//Шаг 4.
uint AA, BB, CC, DD;
 
for(int i=0;i<size/4;i+=16)
 {
 AA = A;BB = B; CC = C; DD = D;
 
 //раунд 1
 A = B + RotateLeft((A + F(B,C,D) + X[i+ 0] + T[ 1]),  7);
 D = A + RotateLeft((D + F(A,B,C) + X[i+ 1] + T[ 2]), 12);
 C = D + RotateLeft((C + F(D,A,B) + X[i+ 2] + T[ 3]), 17);
 B = C + RotateLeft((B + F(C,D,A) + X[i+ 3] + T[ 4]), 22);
 
 A = B + RotateLeft((A + F(B,C,D) + X[i+ 4] + T[ 5]),  7);
 D = A + RotateLeft((D + F(A,B,C) + X[i+ 5] + T[ 6]), 12);
 C = D + RotateLeft((C + F(D,A,B) + X[i+ 6] + T[ 7]), 17);
 B = C + RotateLeft((B + F(C,D,A) + X[i+ 7] + T[ 8]), 22);
 
 A = B + RotateLeft((A + F(B,C,D) + X[i+ 8] + T[ 9]),  7);
 D = A + RotateLeft((D + F(A,B,C) + X[i+ 9] + T[10]), 12);
 C = D + RotateLeft((C + F(D,A,B) + X[i+10] + T[11]), 17);
 B = C + RotateLeft((B + F(C,D,A) + X[i+11] + T[12]), 22);
 
 A = B + RotateLeft((A + F(B,C,D) + X[i+12] + T[13]),  7);
 D = A + RotateLeft((D + F(A,B,C) + X[i+13] + T[14]), 12);
 C = D + RotateLeft((C + F(D,A,B) + X[i+14] + T[15]), 17);
 B = C + RotateLeft((B + F(C,D,A) + X[i+15] + T[16]), 22);
 
 //раунд 2
 A = B + RotateLeft((A + G(B,C,D) + X[i+ 1] + T[17]),  5);
 D = A + RotateLeft((D + G(A,B,C) + X[i+ 6] + T[18]),  9);
 C = D + RotateLeft((C + G(D,A,B) + X[i+11] + T[19]), 14);
 B = C + RotateLeft((B + G(C,D,A) + X[i+ 0] + T[20]), 20);
 
 A = B + RotateLeft((A + G(B,C,D) + X[i+ 5] + T[21]),  5);
 D = A + RotateLeft((D + G(A,B,C) + X[i+10] + T[22]),  9);
 C = D + RotateLeft((C + G(D,A,B) + X[i+15] + T[23]), 14);
 B = C + RotateLeft((B + G(C,D,A) + X[i+ 4] + T[24]), 20);
 
 A = B + RotateLeft((A + G(B,C,D) + X[i+ 9] + T[25]),  5);
 D = A + RotateLeft((D + G(A,B,C) + X[i+14] + T[26]),  9);
 C = D + RotateLeft((C + G(D,A,B) + X[i+ 3] + T[27]), 14);
 B = C + RotateLeft((B + G(C,D,A) + X[i+ 8] + T[28]), 20);
 
 A = B + RotateLeft((A + G(B,C,D) + X[i+13] + T[29]),  5);
 D = A + RotateLeft((D + G(A,B,C) + X[i+ 2] + T[30]),  9);
 C = D + RotateLeft((C + G(D,A,B) + X[i+ 7] + T[31]), 14);
 B = C + RotateLeft((B + G(C,D,A) + X[i+12] + T[32]), 20);
 
 //раунд 3
 A = B + RotateLeft((A + H(B,C,D) + X[i+ 5] + T[33]),  4);
 D = A + RotateLeft((D + H(A,B,C) + X[i+ 8] + T[34]), 11);
 C = D + RotateLeft((C + H(D,A,B) + X[i+11] + T[35]), 16);
 B = C + RotateLeft((B + H(C,D,A) + X[i+14] + T[36]), 23);
 
 A = B + RotateLeft((A + H(B,C,D) + X[i+ 1] + T[37]),  4);
 D = A + RotateLeft((D + H(A,B,C) + X[i+ 4] + T[38]), 11);
 C = D + RotateLeft((C + H(D,A,B) + X[i+ 7] + T[39]), 16);
 B = C + RotateLeft((B + H(C,D,A) + X[i+10] + T[40]), 23);
 
 A = B + RotateLeft((A + H(B,C,D) + X[i+13] + T[41]),  4);
 D = A + RotateLeft((D + H(A,B,C) + X[i+ 0] + T[42]), 11);
 C = D + RotateLeft((C + H(D,A,B) + X[i+ 3] + T[43]), 16);
 B = C + RotateLeft((B + H(C,D,A) + X[i+ 6] + T[44]), 23);
 
 A = B + RotateLeft((A + H(B,C,D) + X[i+ 9] + T[45]),  4);
 D = A + RotateLeft((D + H(A,B,C) + X[i+12] + T[46]), 11);
 C = D + RotateLeft((C + H(D,A,B) + X[i+15] + T[47]), 16);
 B = C + RotateLeft((B + H(C,D,A) + X[i+ 2] + T[48]), 23);
 
 //раунд 4
 A = B + RotateLeft((A + I(B,C,D) + X[i+ 0] + T[49]),  6);
 D = A + RotateLeft((D + I(A,B,C) + X[i+ 7] + T[50]), 10);
 C = D + RotateLeft((C + I(D,A,B) + X[i+14] + T[51]), 15);
 B = C + RotateLeft((B + I(C,D,A) + X[i+ 5] + T[52]), 21);
 
 A = B + RotateLeft((A + I(B,C,D) + X[i+12] + T[53]),  6);
 D = A + RotateLeft((D + I(A,B,C) + X[i+ 3] + T[54]), 10);
 C = D + RotateLeft((C + I(D,A,B) + X[i+10] + T[55]), 15);
 B = C + RotateLeft((B + I(C,D,A) + X[i+ 1] + T[56]), 21);
 
 A = B + RotateLeft((A + I(B,C,D) + X[i+ 8] + T[57]),  6);
 D = A + RotateLeft((D + I(A,B,C) + X[i+15] + T[58]), 10);
 C = D + RotateLeft((C + I(D,A,B) + X[i+ 6] + T[59]), 15);
 B = C + RotateLeft((B + I(C,D,A) + X[i+13] + T[60]), 21);
 
 A = B + RotateLeft((A + I(B,C,D) + X[i+ 4] + T[61]),  6);
 D = A + RotateLeft((D + I(A,B,C) + X[i+11] + T[62]), 10);
 C = D + RotateLeft((C + I(D,A,B) + X[i+ 2] + T[63]), 15);
 B = C + RotateLeft((B + I(C,D,A) + X[i+ 9] + T[64]), 21);
 
 A = AA + A;
 B = BB + B;
 C = CC + C;
 D = DD + D;
}
 
delete []X; //освобождаем память, выделенную под массив Х.
delete []cIn; //освобождаем память, выделенную для выровненного входного сообщения.
 
 
 
 
}
string sIn = "VHOD";
int A = 0;
int B = 0;
int C = 0;
int D = 0;
Добавлено через 4 часа 11 минут
Пишет, кстати, что string subscript out of range

Добавлено через 30 минут
С помощью отладчика нашел проблему. В цикле
C++
1
2
for(int i=0;i<length;i++) //первые length элементов сIn
 cIn[i]=sIn[i+1]; //заполняем символами входного сообщения
доходило до 4 значения sIn, хотя их три.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2012, 02:04
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Цель - сделать AES с MD5 (C++):

Хэширование md5 и шифрование AES
Собственно нужно реализовать проверку пароля, его хранить в открытом виде...

AES в C++
Привет, где можно найти рабочую функцию шифрования/дешифрования AES в С++ ?...

Расчет попадания артснаряда в цель
По данным военной разведки штаб противника находится на расстоянии R(км), от...

AES шифрование
Разработать на языке программирования C/C++ консольное или оконное...

AES. Расшифровка
Допустим, у меня есть такие функции AES. /* алгоритм AES-256 размер блока -...

Aes шифрование
Здравствуйте! Зашифровываю файл и вывожу частоту вхождения символов. Такой...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2012, 02:04
Привет! Вот еще темы с решениями:

AES библиотека
Какую библиотеку можно использовать для работы с AES на C++ (Windows)?

Как реализовать AES на С++
У кого-нибудь есть рабочий код с функциями шифровки/дешифровки. А то нигде не...

Алгоритм шифрования AES
Всем доброго времени суток! Господа, прошу помочь определиться с тем как более...

AES не совпадает ни 1 вариант
Беру цифру 1, пароль тоже 1. Большинство выводят результат в base64, я нашёл...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru