Advertisement
z1rix

Secure Hash Algorithm - 256 (max 448 bit Input)

May 23rd, 2021
1,192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.27 KB | None | 0 0
  1. def right_rotate(data, d):
  2.     first = data[:len(data)-d]
  3.     second = data[len(data)-d:]
  4.     full = second + first
  5.     return full
  6.  
  7.  
  8. def addition32(bad_add):
  9.     length = len(bad_add)
  10.     if length > 32:
  11.         ll = length-32
  12.         good_add = bad_add[ll:]
  13.         good_add = f'{int(good_add, 2):032b}'
  14.         return good_add
  15.  
  16.     if length == 32:
  17.         return bad_add
  18.  
  19.  
  20. def sha_256():
  21.     input_data = input('Scrivete qualcosa:')
  22.  
  23.     data_bin = ''.join(format(ord(item), '08b') for item in input_data)
  24.  
  25.     len_data = int(len(data_bin))
  26.  
  27.     data_bin = data_bin+'1'
  28.  
  29.     len_data_bin = f'{len_data:08b}'
  30.  
  31.     constant_512 = 512
  32.  
  33.     len_len_data_bin = int(len(len_data_bin))
  34.     updated_constant = constant_512-len_data-len_len_data_bin-1
  35.  
  36.     updated_to_512_data = data_bin + '0' * updated_constant+len_data_bin
  37.  
  38.     h0 = 0x6a09e667
  39.     h1 = 0xbb67ae85
  40.     h2 = 0x3c6ef372
  41.     h3 = 0xa54ff53a
  42.     h4 = 0x510e527f
  43.     h5 = 0x9b05688c
  44.     h6 = 0x1f83d9ab
  45.     h7 = 0x5be0cd19
  46.  
  47.     k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
  48.          0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
  49.          0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
  50.          0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
  51.          0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
  52.          0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
  53.          0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
  54.          0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]
  55.  
  56.     w = []
  57.     n = 32
  58.  
  59.     for item in range(0, len(updated_to_512_data), n):
  60.         w.append(str(updated_to_512_data)[item: item + n])
  61.  
  62.     for w_add_zero in range(16, 64):
  63.         zero_32 = f"{int('0', 2):032b}"
  64.         w.insert(w_add_zero, zero_32)
  65.  
  66.     for i in range(16, 64):
  67.         i_15 = i-15
  68.         wi_15 = w[i_15]
  69.         wi_15_7 = right_rotate(wi_15, 7)
  70.         wi_15_18 = right_rotate(wi_15, 18)
  71.         wi_15_3 = '{:032b}'.format(int(wi_15, 2) >> 3)
  72.         wi_15_7 = f'{int(wi_15_7, 2):032b}'
  73.         wi_15_18 = f'{int(wi_15_18, 2):032b}'
  74.         s0 = f'{int(wi_15_7, 2) ^ int(wi_15_18, 2) ^ int(wi_15_3, 2):032b}'
  75.  
  76.         i_2 = i-2
  77.         wi_2 = w[i_2]
  78.         wi_2_17 = right_rotate(wi_2, 17)
  79.         wi_2_19 = right_rotate(wi_2, 19)
  80.         wi_2_10 = '{:032b}'.format(int(wi_2, 2) >> 10)
  81.         wi_2_17 = f'{int(wi_2_17, 2):032b}'
  82.         wi_2_19 = f'{int(wi_2_19, 2):032b}'
  83.         s1 = f'{int(wi_2_17, 2) ^ int(wi_2_19, 2) ^ int(wi_2_10, 2):032b}'
  84.  
  85.         i_16 = i-16
  86.         i_7 = i-7
  87.  
  88.         w_16 = f'{int(w[i_16], 2) + int(s0, 2) + int(w[i_7], 2) + int(s1, 2):032b}'
  89.         w[i] = addition32(w_16)
  90.  
  91.     a = f'{h0:032b}'
  92.     b = f'{h1:032b}'
  93.     c = f'{h2:032b}'
  94.     d = f'{h3:032b}'
  95.     e = f'{h4:032b}'
  96.     f = f'{h5:032b}'
  97.     g = f'{h6:032b}'
  98.     h = f'{h7:032b}'
  99.  
  100.     for x in range(0, 64):
  101.  
  102.         e_6 = f'{int(right_rotate(e, 6), 2):032b}'
  103.         e_11 = f'{int(right_rotate(e, 11), 2):032b}'
  104.         e_25 = f'{int(right_rotate(e, 25), 2):032b}'
  105.  
  106.         s1_1 = f'{int(e_6, 2) ^ int(e_11, 2) ^ int(e_25, 2):032b}'
  107.  
  108.         e_f = f'{int(e, 2) & int(f, 2):032b}'
  109.         ne = ''.join(['1' if inverse == '0' else '0' for inverse in e])
  110.         ne_g = f'{int(ne, 2) & int(g, 2):032b}'
  111.  
  112.         ch = f'{int(e_f, 2) ^ int(ne_g, 2):032b}'
  113.  
  114.         kx = f'{k[x]:032b}'
  115.  
  116.         temp_1 = f'{int(h, 2) + int(s1_1, 2) + int(ch, 2) + int(kx, 2) + int(w[x], 2):032b}'
  117.         temp_1 = addition32(temp_1)
  118.  
  119.         a_2 = f'{int(right_rotate(a, 2), 2):032b}'
  120.         a_13 = f'{int(right_rotate(a, 13), 2):032b}'
  121.         a_22 = f'{int(right_rotate(a, 22), 2):032b}'
  122.  
  123.         s0_1 = f'{int(a_2, 2) ^ int(a_13, 2) ^ int(a_22, 2):032b}'
  124.  
  125.         a_b = f'{int(a, 2) & int(b, 2):032b}'
  126.         a_c = f'{int(a, 2) & int(c, 2):032b}'
  127.         b_c = f'{int(b, 2) & int(c, 2):032b}'
  128.  
  129.         maj = f'{int(a_b, 2) ^ int(a_c, 2) ^ int(b_c, 2):032b}'
  130.  
  131.         temp_2 = f'{int(s0_1, 2) + int(maj, 2):032b}'
  132.         temp_2 = addition32(temp_2)
  133.  
  134.         h = f'{int(g, 2):032b}'
  135.         g = f'{int(f, 2):032b}'
  136.         f = f'{int(e, 2):032b}'
  137.         e = f'{int(d, 2) + int(temp_1, 2):032b}'
  138.         e = addition32(e)
  139.         d = f'{int(c, 2):032b}'
  140.         c = f'{int(b, 2):032b}'
  141.         b = f'{int(a, 2):032b}'
  142.         a = f'{int(temp_1, 2) + int(temp_2, 2):032b}'
  143.         a = addition32(a)
  144.  
  145.     h0 = f'{h0 + int(a, 2):032b}'
  146.     h1 = f'{h1 + int(b, 2):032b}'
  147.     h2 = f'{h2 + int(c, 2):032b}'
  148.     h3 = f'{h3 + int(d, 2):032b}'
  149.     h4 = f'{h4 + int(e, 2):032b}'
  150.     h5 = f'{h5 + int(f, 2):032b}'
  151.     h6 = f'{h6 + int(g, 2):032b}'
  152.     h7 = f'{h7 + int(h, 2):032b}'
  153.  
  154.     h0 = addition32(h0)
  155.     h1 = addition32(h1)
  156.     h2 = addition32(h2)
  157.     h3 = addition32(h3)
  158.     h4 = addition32(h4)
  159.     h5 = addition32(h5)
  160.     h6 = addition32(h6)
  161.     h7 = addition32(h7)
  162.  
  163.     digest = str(h0) + str(h1) + str(h2) + str(h3) + str(h4) + str(h5) + str(h6) + str(h7)
  164.     digest = f'{int(digest, 2):x}'
  165.     print(digest)
  166.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement