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

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

Восстановить пароль Регистрация
 
winpiece
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 20
29.04.2014, 02:10     Ошибка в реализации хеш-функции SHA1 #1
Здравствуйте,
Решил написать простую реализацию, но результат вычислений оставляет желать лучшего
Подскажите, пожалуйста, какой нюанс я упустил при построении?
Доп. функции:
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);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.04.2014, 02:10     Ошибка в реализации хеш-функции SHA1
Посмотрите здесь:

C++ хеш функции
Получить хеш файла (CRC32, MD5, SHA1, TTH, ED2K, BitPrint, AICH....) C++
Метод однократной интерполяции (ошибка в реализации) C++
C++ Оценка хеш-функции
C++ Хеш-функции. Метод открытого хеширования
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
29.04.2014, 05:38     Ошибка в реализации хеш-функции SHA1 #2
winpiece, откуда вообще код родился?
P.s. Для удаления массива нужно вызывать delete[] (с квадратными скобками).
winpiece
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 20
29.04.2014, 07:27  [ТС]     Ошибка в реализации хеш-функции SHA1 #3
псевдокод sha1
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
29.04.2014, 08:49     Ошибка в реализации хеш-функции SHA1 #4
Цитата Сообщение от winpiece Посмотреть сообщение
результат вычислений оставляет желать лучшего
По каким критериям такая оценка сложилась?
Готовую реализацию sha1 можно взять например здесь.
winpiece
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 20
29.04.2014, 18:55  [ТС]     Ошибка в реализации хеш-функции SHA1 #5
Значения на выходе не соответствуют действительности
winpiece
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 20
30.04.2014, 08:41  [ТС]     Ошибка в реализации хеш-функции SHA1 #6
Цитата Сообщение от Tulosba Посмотреть сообщение
P.s. Для удаления массива нужно вызывать delete[] (с квадратными скобками).
Вот код:
C++
1
2
3
4
5
6
7
8
int main() {
 
    while (1) {
        int* a=  new int[10];
        delete a;
        
    }
}
А вот утечка памяти(её нет):



Я подумал, что мол компилятор такой умный, но я посмотрел, что он компилирует:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1 "/Users/Alexander/Documents/Project/\321\210\320\270\321\204\321\200\320\260\321\202\320\276\321\200/\321\210\320\270\321\204\321\200\320\260\321\202\320\276\321\200/main.cpp"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 175 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "/Users/Alexander/Documents/Project/\321\210\320\270\321\204\321\200\320\260\321\202\320\276\321\200/\321\210\320\270\321\204\321\200\320\260\321\202\320\276\321\200/main.cpp" 2
int main() {
 
    while (1) {
        int* a= new int[10];
        delete a;
 
    }
}
Т.е. он ничего не заменил, как было так и осталось

Код на ассе
Assembler
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
    .section    __TEXT,__text,regular,pure_instructions
    .globl  _main
    .align  4, 0x90
_main:                                  ## @main
    .cfi_startproc
## BB#0:
    pushq   %rbp
Ltmp2:
    .cfi_def_cfa_offset 16
Ltmp3:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
Ltmp4:
    .cfi_def_cfa_register %rbp
    subq    $32, %rsp
    movl    $0, -4(%rbp)
LBB0_1:                                 ## =>This Inner Loop Header: Depth=1
    movabsq $40, %rdi
    callq   __Znam
    movq    %rax, -16(%rbp)
    movq    -16(%rbp), %rax
    cmpq    $0, %rax
    movq    %rax, -24(%rbp)         ## 8-byte Spill
    je  LBB0_3
## BB#2:                                ##   in Loop: Header=BB0_1 Depth=1
    movq    -24(%rbp), %rax         ## 8-byte Reload
    movq    %rax, %rdi
    callq   __ZdlPv
LBB0_3:                                 ##   in Loop: Header=BB0_1 Depth=1
    jmp LBB0_1
    .cfi_endproc
 
 
.subsections_via_symbols
Миниатюры
Ошибка в реализации хеш-функции SHA1  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2014, 11:30     Ошибка в реализации хеш-функции SHA1
Еще ссылки по теме:

Необходимость реализации виртуальнй функции C++
Ошибка в реализации длинной арифметики C++
C++ Ошибка в реализации вектора

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.04.2014, 11:30     Ошибка в реализации хеш-функции SHA1 #7
winpiece, показательнее проверить вот такой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
struct S
{
    S() { i=++cnt; std::cout << "ctor: " << i << std::endl; }
    ~S() { std::cout << "dtor:" << i << std::endl; }
    static int cnt;
    int i;
};
 
int S::cnt = 0;
 
int main() {
    
    S* p = new S[10];
    delete p; // Не вызываются деструкторы для объектов 2-10. 
    //delete [] p; // Деструктор вызывается для всех объектов
 
    return 0;
}
http://ideone.com/o9QOTF
Yandex
Объявления
30.04.2014, 11:30     Ошибка в реализации хеш-функции SHA1
Ответ Создать тему
Опции темы

Текущее время: 17:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru