Новичок
Профиль
Группа: Участник
Сообщений: 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"); } }
|
|