Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SHA-256, Не сходится значение SHA-256 
V
    Опции темы
KopChenn
  Дата 21.7.2020, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 21.7.2020

Репутация: нет
Всего: нет



Уважаемые форумчане!
Изучаю алгоритм хеширования SHA-256. Входными данными является зашифрованный открытый ключ основной сети: 00453233600a96384bb8d73d400984117ac84d7e8b. Проверил онлайн через хеш-генератор - не сходится. Скорее всего, ошибка в генерации коэффициента w. Есть ли у кого возможность проверить алгоритм (например, проверить по каждому раунду)?

Код

package com.company;
 
public class Main {
 
    public static void main(String[] args) {
 
        long A = 0x6A09E667L;
        long B = 0xBB67AE85L;
        long C = 0x3C6EF372L;
        long D = 0xA54FF53AL;
        long E = 0x510E527FL;
        long F = 0x9B05688CL;
        long G = 0x1F83D9ABL;
        long H = 0x5BE0CD19L;
 
        long[] w = new long[64];   // 00453233600a96384bb8d73d400984117ac84d7e8b - входные данные
        w[0] = 0x00453233L;
        w[1] = 0x600A9638L;
        w[2] = 0x4BB8D73DL;
        w[3] = 0x40098411L;
        w[4] = 0x7AC84D7EL;
        w[5] = 0x8B800000L;
        w[6] = 0x00000000L;
        w[7] = 0x00000000L;
        w[8] = 0x00000000L;
        w[9] = 0x00000000L;
        w[10] = 0x00000000L;
        w[11] = 0x00000000L;
        w[12] = 0x00000000L;
        w[13] = 0x00000000L;
        w[14] = 0x00000000L;
        w[15] = 0x000000A8L;
 
        long[] k = {0x428A2F98L, 0x71374491L, 0xB5C0FBCFL, 0xE9B5DBA5L, 0x3956C25BL, 0x59F111F1L, 0x923F82A4L, 0xAB1C5ED5L,
                0xD807AA98L, 0x12835B01L, 0x243185BEL, 0x550C7DC3L, 0x72BE5D74L, 0x80DEB1FEL, 0x9BDC06A7L, 0xC19BF174L,
                0xE49B69C1L, 0xEFBE4786L, 0x0FC19DC6L, 0x240CA1CCL, 0x2DE92C6FL, 0x4A7484AAL, 0x5CB0A9DCL, 0x76F988DAL,
                0x983E5152L, 0xA831C66DL, 0xB00327C8L, 0xBF597FC7L, 0xC6E00BF3L, 0xD5A79147L, 0x06CA6351L, 0x14292967L,
                0x27B70A85L, 0x2E1B2138L, 0x4D2C6DFCL, 0x53380D13L, 0x650A7354L, 0x766A0ABBL, 0x81C2C92EL, 0x92722C85L,
                0xA2BFE8A1L, 0xA81A664BL, 0xC24B8B70L, 0xC76C51A3L, 0xD192E819L, 0xD6990624L, 0xF40E3585L, 0x106AA070L,
                0x19A4C116L, 0x1E376C08L, 0x2748774CL, 0x34B0BCB5L, 0x391C0CB3L, 0x4ED8AA4AL, 0x5B9CCA4FL, 0x682E6FF3L,
                0x748F82EEL, 0x78A5636FL, 0x84C87814L, 0x8CC70208L, 0x90BEFFFAL, 0xA4506CEBL, 0xBEF9A3F7L, 0xC67178F2L};
 
        for (byte r = 0; r <= 63; r++) {   // цикл 64 раунда
 
            String A_2 = String.format("%32s", Long.toBinaryString(A)).replace(' ', '0');
            char[] array_A = A_2.toCharArray();
 
            String B_2 = String.format("%32s", Long.toBinaryString(B)).replace(' ', '0');
            char[] array_B = B_2.toCharArray();
 
            String C_2 = String.format("%32s", Long.toBinaryString(C)).replace(' ', '0');
            char[] array_C = C_2.toCharArray();
 
            String E_2 = String.format("%32s", Long.toBinaryString(E)).replace(' ', '0');
            char[] array_E = E_2.toCharArray();
 
            String F_2 = String.format("%32s", Long.toBinaryString(F)).replace(' ', '0');
            char[] array_F = F_2.toCharArray();
 
            String G_2 = String.format("%32s", Long.toBinaryString(G)).replace(' ', '0');
            char[] array_G = G_2.toCharArray();
 
            char[] array_Ma_2 = new char[32];
            for (byte i = 0; i <= 31; i++) {
                if (array_A[i] == '0' && array_B[i] == '0' && array_C[i] == '0' || array_A[i] == '0' && array_B[i] == '0' && array_C[i] == '1' || array_A[i] == '0' && array_B[i] == '1' && array_C[i] == '0' || array_A[i] == '1' && array_B[i] == '0' && array_C[i] == '0') {
                    array_Ma_2[i] = '0';
                } else {
                    array_Ma_2[i] = '1';
                }
            }
            String Ma_2 = String.valueOf(array_Ma_2);
            String Ma_16 = String.format("%8X", Long.parseLong(Ma_2, 2)).replace(' ', '0');
            long Ma = Long.parseLong(Ma_16, 16);   // значение Ma
 
            char[] array_Ch_2 = new char[32];
            for (byte i = 0; i <= 31; i++) {
                if (array_E[i] == '1') {
                    array_Ch_2[i] = array_F[i];
                } else {
                    array_Ch_2[i] = array_G[i];
                }
            }
            String Ch_2 = String.valueOf(array_Ch_2);
            String Ch_16 = String.format("%8X", Long.parseLong(Ch_2, 2)).replace(' ', '0');
            long Ch = Long.parseLong(Ch_16, 16);   // значение Ch
 
            char[] array_Sum0 = new char[32];
            char[] array_A_2 = new char[32];
            char[] array_A_13 = new char[32];
            char[] array_A_22 = new char[32];
            int j = 30;
            for (byte i = 0; i <= 31; i++) {
                array_A_2[i] = array_A[j];
                if (j == 31) {
                    j = 0;
                } else {
                    j++;
                }
            }
            j = 19;
            for (byte i = 0; i <= 31; i++) {
                array_A_13[i] = array_A[j];
                if (j == 31) {
                    j = 0;
                } else {
                    j++;
                }
            }
            j = 10;
            for (byte i = 0; i <= 31; i++) {
                array_A_22[i] = array_A[j];
                if (j == 31) {
                    j = 0;
                } else {
                    j++;
                }
            }
            for (byte i = 0; i <= 31; i++) {
                if (array_A_2[i] == '0' && array_A_13[i] == '0' && array_A_22[i] == '0' || array_A_2[i] == '0' && array_A_13[i] == '1' && array_A_22[i] == '1' || array_A_2[i] == '1' && array_A_13[i] == '0' && array_A_22[i] == '1' || array_A_2[i] == '1' && array_A_13[i] == '1' && array_A_22[i] == '0') {
                    array_Sum0[i] = '0';
                } else {
                    array_Sum0[i] = '1';
                }
            }
            String Sum0_2 = String.valueOf(array_Sum0);
            String Sum0_16 = String.format("%8X", Long.parseLong(Sum0_2, 2)).replace(' ', '0');
            long Sum0 = Long.parseLong(Sum0_16, 16);   // значение Sum0
 
            char[] array_Sum1 = new char[32];
            char[] array_E_6 = new char[32];
            char[] array_E_11 = new char[32];
            char[] array_E_25 = new char[32];
            j = 26;
            for (byte i = 0; i <= 31; i++) {
                array_E_6[i] = array_E[j];
                if (j == 31) {
                    j = 0;
                } else {
                    j++;
                }
            }
            j = 21;
            for (byte i = 0; i <= 31; i++) {
                array_E_11[i] = array_E[j];
                if (j == 31) {
                    j = 0;
                } else {
                    j++;
                }
            }
            j = 7;
            for (byte i = 0; i <= 31; i++) {
                array_E_25[i] = array_E[j];
                if (j == 31) {
                    j = 0;
                } else {
                    j++;
                }
            }
            for (byte i = 0; i <= 31; i++) {
                if (array_E_6[i] == '0' && array_E_11[i] == '0' && array_E_25[i] == '0' || array_E_6[i] == '0' && array_E_11[i] == '1' && array_E_25[i] == '1' || array_E_6[i] == '1' && array_E_11[i] == '0' && array_E_25[i] == '1' || array_E_6[i] == '1' && array_E_11[i] == '1' && array_E_25[i] == '0') {
                    array_Sum1[i] = '0';
                } else {
                    array_Sum1[i] = '1';
                }
            }
            String Sum1_2 = String.valueOf(array_Sum1);
            String Sum1_16 = String.format("%8X", Long.parseLong(Sum1_2, 2)).replace(' ', '0');
            long Sum1 = Long.parseLong(Sum1_16, 16);   // значение Sum1
 
            if (r > 15) {
                String w0 = String.format("%32s", Long.toBinaryString(w[r - 15])).replace(' ', '0');
                char[] array_w0 = w0.toCharArray();
                char[] array_w0_7 = new char[32];
                char[] array_w0_18 = new char[32];
                char[] array_w0_3 = new char[32];
                j = 25;
                for (byte i = 0; i <= 31; i++) {
                    array_w0_7[i] = array_w0[j];
                    if (j == 31) {
                        j = 0;
                    } else {
                        j++;
                    }
                }
                j = 14;
                for (byte i = 0; i <= 31; i++) {
                    array_w0_18[i] = array_w0[j];
                    if (j == 31) {
                        j = 0;
                    } else {
                        j++;
                    }
                }
                array_w0_3[0] = '0';
                array_w0_3[1] = '0';
                array_w0_3[2] = '0';
                j = 2;
                for (byte i = 0; i <= 28; i++) {
                    j++;
                    array_w0_3[j] = array_w0[i];
                }
                for (byte i = 0; i <= 31; i++) {
                    if (array_w0_7[i] == '0' && array_w0_18[i] == '0' && array_w0_3[i] == '0' || array_w0_7[i] == '0' && array_w0_18[i] == '1' && array_w0_3[i] == '1' || array_w0_7[i] == '1' && array_w0_18[i] == '0' && array_w0_3[i] == '1' || array_w0_7[i] == '1' && array_w0_18[i] == '1' && array_w0_3[i] == '0') {
                        array_w0[i] = '0';
                    } else {
                        array_w0[i] = '1';
                    }
                }
                String w0_2 = String.valueOf(array_w0);
                String w0_16 = String.format("%8X", Long.parseLong(w0_2, 2)).replace(' ', '0');
                long s0 = Long.parseLong(w0_16, 16);
 
                String w1 = String.format("%32s", Long.toBinaryString(w[r - 2])).replace(' ', '0');
                char[] array_w1 = w1.toCharArray();
                char[] array_w1_17 = new char[32];
                char[] array_w1_19 = new char[32];
                char[] array_w1_10 = new char[32];
                j = 15;
                for (byte i = 0; i <= 31; i++) {
                    array_w1_17[i] = array_w1[j];
                    if (j == 31) {
                        j = 0;
                    } else {
                        j++;
                    }
                }
                j = 13;
                for (byte i = 0; i <= 31; i++) {
                    array_w1_19[i] = array_w1[j];
                    if (j == 31) {
                        j = 0;
                    } else {
                        j++;
                    }
                }
                for (byte i = 0; i <= 9; i++) {
                    array_w1_10[i] = '0';
                }
                j = 9;
                for (byte i = 0; i <= 21; i++) {
                    j++;
                    array_w1_10[j] = array_w1[i];
                }
                for (byte i = 0; i <= 31; i++) {
                    if (array_w1_17[i] == '0' && array_w1_19[i] == '0' && array_w1_10[i] == '0' || array_w1_17[i] == '0' && array_w1_19[i] == '1' && array_w1_10[i] == '1' || array_w1_17[i] == '1' && array_w1_19[i] == '0' && array_w1_10[i] == '1' || array_w1_17[i] == '1' && array_w1_19[i] == '1' && array_w1_10[i] == '0') {
                        array_w1[i] = '0';
                    } else {
                        array_w1[i] = '1';
                    }
                }
                String w1_2 = String.valueOf(array_w1);
                String w1_16 = String.format("%8X", Long.parseLong(w1_2, 2)).replace(' ', '0');
                long s1 = Long.parseLong(w1_16, 16);
 
                w[r] = w[r - 16] + s0 + w[r - 7] + s1;
                w[r] = w[r] % 0x100000000L;   // w для раунда r
            }
 
 
            long new_A = H + Ma + Ch + Sum0 + Sum1 + w[r] + k[r];
            new_A = new_A % 0x100000000L;
            long new_B = A;
            long new_C = B;
            long new_D = C;
            long new_E = D + H + Ch + Sum1 + w[r] + k[r];
            new_E = new_E % 0x100000000L;
            long new_F = E;
            long new_G = F;
            long new_H = G;
 
            A = new_A;
            B = new_B;
            C = new_C;
            D = new_D;
            E = new_E;
            F = new_F;
            G = new_G;
            H = new_H;
 
        }
 
        System.out.println("Ответ:");
        System.out.printf("%X", A);
        System.out.printf("%X", B);
        System.out.printf("%X", C);
        System.out.printf("%X", D);
        System.out.printf("%X", E);
        System.out.printf("%X", F);
        System.out.printf("%X", G);
        System.out.printf("%X", H);
        System.out.println("\n");
 
        System.out.print("Правильный ответ:\nA0902318B61F705CF36C97DBBB084E12EDCA6F537EFE6ED872801AE541A26065\n");
 
    }
}

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1081 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.