1 / 1 / 1
Регистрация: 06.03.2016
Сообщений: 64

Ошибка в реализации алгоритма хеширования SHA3 (keccak)

06.12.2018, 21:11. Показов 2615. Ответов 1

Студворк — интернет-сервис помощи студентам
Мне нужно реализовать хеширование SHA-3. Вроде все сделал, но выводит неправильный результат.

Код писал на основе данной статьи. Исключением является только преобразование ι (yota), которое я реализовал по-другому, с использованием раундовых констант, которые у меня изначально хранятся в массиве, а не высчитываются, как это делается в документе (если, конечно, я правильно понял).

Также для хранения битов использовал класс BitArray из модуля bitstring, который загрузил отсюда.

Код на питоне 3:

Python
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
from math import log
from bitstring import BitArray
 
rc = [
    BitArray('0x0000000000000001'), BitArray('0x0000000000008082'),
    BitArray('0x800000000000808A'), BitArray('0x8000000080008000'),
    BitArray('0x000000000000808B'), BitArray('0x0000000080000001'),
    BitArray('0x8000000080008081'), BitArray('0x8000000000008009'),
    BitArray('0x000000000000008A'), BitArray('0x0000000000000088'),
    BitArray('0x0000000080008009'), BitArray('0x000000008000000A'),
    BitArray('0x000000008000808B'), BitArray('0x800000000000008B'),
    BitArray('0x8000000000008089'), BitArray('0x8000000000008003'),
    BitArray('0x8000000000008002'), BitArray('0x8000000000000080'),
    BitArray('0x000000000000800A'), BitArray('0x800000008000000A'),
    BitArray('0x8000000080008081'), BitArray('0x8000000000008080'),
    BitArray('0x0000000080000001'), BitArray('0x8000000080008008')]
 
def init_state(b, r):
    w = b // 25
    l = int(log(w, 2))
    nr = 12 + 2*l
    c = b - r
    return w, c, l, nr
 
b = 1600
r = 576
d = 512
w, c, l, nr = init_state(b, r)
 
def from_cube(a):
    return BitArray([a[x][y][z] for x in range(5) for y in range(5) for z in range(w)])
 
def to_cube(s):
    return [[[s[(5*x + y)*w + z] for z in range(w)] for y in range(5)] for x in range(5)]
 
def theta(a):
    c = [[False for z in range(w)] for x in range(5)]
    d = [[False for z in range(w)] for x in range(5)]
    for x in range(5):
        for z in range(w):
            c[x][z] = a[x][0][z] ^ a[x][1][z] ^ a[x][2][z] ^ a[x][3][z] ^ a[x][4][z]
    for x in range(5):
        for z in range(w):
            d[x][z] = c[(x-1) % 5][z] ^ c[(x+1) % 5][(z-1) % w]
    for x in range(5):
        for y in range(5):
            for z in range(w):
                a[x][y][z] ^= d[x][z]
    return a
 
def ro(a):
    x, y = 1, 0
    for t in range(24):
        for z in range(w):
            a[x][y][z] = a[x][y][(z - (t + 1)*(t + 2)//2) % w]
        x, y = y, ((2*x + 3*y) % 5)
    return a
 
def pi(a):
    for x in range(5):
        for y in range(5):
            for z in range(w):
                a[x][y][z] = a[(x + 3*y) % 5][x][z]
    return a
 
def hi(a):
    for x in range(5):
        for y in range(5):
            for z in range(w):
                a[x][y][z] ^= (~a[(x + 1) % 5][y][z] and a[(x + 2) % 5][y][z])
    return a
 
def yota(a, ir):
    a[0][0] = list(a[0][0] ^ rc[ir])
    return a
 
def f(s):
    a = to_cube(s)
    for ir in range(12 + 2*l - nr, 12 + 2*l):
        a = yota(hi(pi(ro(theta(a)))), ir)
    s = from_cube(a)
    return s
        
def pad10_1(x, m):
    j = (-2-m) % x
    return BitArray(bin='1' + j * '0' + '1')
 
def str_to_hashable(s):
    bar = BitArray(s.encode())
    return bar, len(bar)
 
def hash(string):
    s, s_l = str_to_hashable(string)
    s += pad10_1(r, s_l)
    blocks = [s[i:i+r] for i in range(0, len(s), r)]
    n = len(blocks)
    state = BitArray(bin=b * '0')
    for i in range(n):
        state = f(state ^ (blocks[i] + BitArray(bin=c * '0')))
    z = state[:r]
    while d > len(z):
        state = f(state)
        z += state[:r]
    return z[:d].hex
Пример:

Python
1
2
string = 'The quick brown fox jumps over the lazy dog'
print(hash(string))
Должен выводить:

01dedd5de4ef14642445ba5f5b97c15e47b9ad93 1326e4b0727cd94cefc44fff23f07bf543139939 b49128caf436dc1bdee54fcb24023a08d9403f9b 4bf0d450

Выводит:

536672ec4d9b50475d3e5615d3e5615d89eafac4 f57d627a6b06dee4444995acfc71c4f15a7929b4 8f0d8085609cab1d9e84fa2e7926dbf1480d1948 0d19480d
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.12.2018, 21:11
Ответы с готовыми решениями:

SHA3-512 (KECCAK)
Добрый день! Подскажите пожалуйста, существует недопонимание: как говорит великая Вики и стандарт Keccac (FIPS202) - функции SHA3...

Ошибка в реализации алгоритма Хаффмана
Доброго дня. Есть более-менее работающая реализация алгоритма Хаффмана: // HuffmanAlgConsole.cpp: определяет точку входа для...

Сортировка Шелла. Ошибка в моей реализации алгоритма
Сортирует все элементы кроме последнего. Body; . . . void Sort()

1
Фрилансер
 Аватар для Black Fregat
3709 / 2083 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
08.12.2018, 11:40
Лучший ответ Сообщение было отмечено WhiscasH как решение

Решение

Объясните, пожалуйста, какая цель Ваших действий?

Вы хотите разобраться в алгоритме? Тогда проще всего взять работающую реализацию, может быть даже на другом языке, и искать место расхождения значений. Вы хотите, чтобы за Вас этим занялся кто-то другой?

А если вам нужен результат, то почему не взять готовую реализацию?
Code
1
2
3
4
5
>>> from hashlib import sha3_512
>>> h = sha3_512()
>>> h.update(b'The quick brown fox jumps over the lazy dog')
>>> h.digest().hex()
'01dedd5de4ef14642445ba5f5b97c15e47b9ad931326e4b0727cd94cefc44fff23f07bf543139939b49128caf436dc1bdee54fcb24023a08d9403f9b4bf0d450'
Добавлено через 2 часа 22 минуты
Неприятности у Вас с самого начала. Вот какой блок уходит на обработку в реальном алгоритме:
Code
1
2
3
4
5
6
7
8
9
54 68 65 20 71 75 69 63
6b 20 62 72 6f 77 6e 20
66 6f 78 20 6a 75 6d 70
73 20 6f 76 65 72 20 74
68 65 20 6c 61 7a 79 20
64 6f 67 06 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 80
Это немного не похоже на ваш паддинг..
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.12.2018, 11:40
Помогаю со студенческими работами здесь

Ошибка в реализации алгоритма извлечения квадратного корня
Написал маленький код по извлечению квадратного корня. Но, видимо, где-то конкретно ошибся. Подскажите, где? import static...

Написать программу реализации словаря посредством закрытого хеширования.
собстно сабж

По поводу алгоритма хеширования Md5
Объясните плыз более менее русским языком принцип хеширования, по какому алгоритму это происходит А то в мудреные объяснения и исходники...

Реализация алгоритма хеширования scrypt
Приветствую всех! Подскажите, существует ли реализация алгоритма хеширования scrypt в java?

Защита программ с помощью алгоритма хеширования md2
Помогите пожалуйста!Мне нужно написать прогу которая бы шифровала и розшифровывала файлы с помощью алгоритма хеширования MD 2.Подскажите...


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

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

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru