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

Ошибка в реализации хеш-функции SHA1 - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как правильно размещать классы http://www.cyberforum.ru/cpp-beginners/thread1160753.html
Доброго времени суток. При написании проекта, состоящего из большого количества файлов из-за путаницы и непонятных багов возник вопрос - как же все-таки правильно размещать классы? Писать их в хедер или CPPшник? Методы класса пока пишу в нем самом, но если захочу оттуда перенести, то можно ли переносить в другой файл? Если класс размешен в пространстве имен, то как это повлияет на все...
C++ Найти количество пассажиров, количество вещей которых превышает среднее число вещей Багаж пассажира характеризуется количеством вещей и общим весом вещей. Даны сведения о багаже ​​нескольких пассажиров. Найти количество пассажиров, количество вещей которых превышает среднее число вещей Никак не могу понять как это сделает помогите пожалуйста http://www.cyberforum.ru/cpp-beginners/thread1160743.html
Заполнить массив B значениями элементов массива A, исключив из него повторяющиеся элементы C++
Добрый вечер! Задача стоит так: Заполнить массив B значениями элементов массива A, исключив из него повторяющиеся элементы. Освободившиеся ячейки заполнить максимальным элементом массива A. Не могу понять,как сделать. Создается два массива,прогоняются через цикл, а как заполнить не понимаю, нужен счетчик?
Error C4996: 'strcpy' C++
Проблема такая, есть код, который должен работать, но он не работает и выдаёт это: error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. вот код на С++(писал на MS VS:2013): //main.cpp #include <iostream> #include "Triangle.h" using namespace std;
C++ Даны натуральное число n и символьная квадратная матрица порядка n. Получить последовательность http://www.cyberforum.ru/cpp-beginners/thread1160716.html
Даны натурального n,символьная квадратная матрица порядка n.Получить последовательность b1,...,bn , из нулей и единиц,в которой bi=1 тогда и только тогда,когда в i-й строке символов * не меньше числа пробелов Что не так? #include "iostream" using namespace std; int main() { int i,j, n, p, z;
C++ Сформировать одномерный массив из элементов, которые повторяются в матрице Задается матрица. Сделать программу которая делает одномерный массив из элементов, которые повторяются в матрице. Элементы в массиве не должны повторятся. Вот есть небольшие наброски программы, помогите отладить и исправить ошибки. #include <iostream> #include <conio.h> #include <time.h> подробнее

Показать сообщение отдельно
winpiece
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 20

Ошибка в реализации хеш-функции SHA1 - C++

29.04.2014, 02:10. Просмотров 791. Ответов 6
Метки (Все метки)

Здравствуйте,
Решил написать простую реализацию, но результат вычислений оставляет желать лучшего
Подскажите, пожалуйста, какой нюанс я упустил при построении?
Доп. функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef unsigned char byte;
typedef unsigned int uint;
 
const inline uint SHA1::LeftRotate(uint Value, uint Shift) const noexcept {
    return Value << Shift | Value >> (32 - Shift);
}
 
inline void SHA1::ToBytes(uint Value, byte* Buffer) const noexcept {
    *(uint*)Buffer = Value;
}
 
inline uint SHA1::ToUInt(byte* Bytes) const noexcept {
    return *(uint*)Bytes;
}
Сам код:
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
void SHA1::GetHash(const byte* Input, uint InputLength, byte* Buffer) const noexcept {
    uint a, A = 0x67452301;
    uint b, B = 0xEFCDAB89;
    uint c, C = 0x98BADCFE;
    uint d, D = 0x10325476;
    uint e, E = 0xC3D2E1F0;
    uint NewLength, f, g, tmp;
    uint temp[80];
    for (NewLength = InputLength + 1; NewLength % 64 != 56; NewLength++); //добиваем до NewLength mod 512 = 448
    byte* Message = new byte[NewLength + 8];
    memset(Message, 0, NewLength + 8);
    memcpy(Message, Input, InputLength);
    Message[InputLength] = 0x80; //единицу в конец входящего сообщения 
    ToBytes(InputLength * 8, Message + NewLength);
    ToBytes(InputLength >> 29, Message + NewLength + 4);
    /**(unsigned long*)(Message + NewLength) = InputLength * 8;*/ // размер входа в битах в конец
    for (uint index = 0; index < NewLength; index += 64) {
        for (uint i = 0; i < 16; i++)
            temp[i] = ToUInt(Message + index + i * 4);
        for (uint i = 16; i < 80; i++)
            temp[i] = LeftRotate(temp[i - 3] ^ temp[i - 8] ^ temp[i - 14] ^ temp[i - 16], 1);
        a = A; b = B; c = C; d = D; e = E;
        for (uint i = 0; i < 80; i++) {
            if (i < 20) {
                f = (b & c) | ((~b) & d);
                g = 0x5A827999;
            } else if (i < 40) {
                f = b ^ c ^ d;
                g = 0x6ED9EBA1;
            } else if (i < 60) {
                f = (b & c) | (b & d) | (c & d);
                g = 0x8F1BBCDC;
            } else {
                f = b ^ c ^ d;
                g = 0xCA62C1D6;
            }
            tmp = LeftRotate(a, 5) + f + g + e + temp[i];
            e = d;
            d = c;
            c = LeftRotate(b, 30);
            b = a;
            a = tmp;
        }
        A += a;
        B += b;
        C += c;
        D += d;
        E += e;
    }
    delete Message;
    ToBytes(A, Buffer);
    ToBytes(B, Buffer + 4);
    ToBytes(C, Buffer + 8);
    ToBytes(D, Buffer + 12);
    ToBytes(E, Buffer + 16);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 17:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru