How Hash Algorithms Work

What is a 'Hash Algorithm'?

What are hash algorithms used for?

Important properties:

Example:

How hash algorithms actually work:

Step 0: Initialize some variables

h0 = 01100111010001010010001100000001

h1 = 11101111110011011010101110001001

h2 = 10011000101110101101110011111110

h3 = 00010000001100100101010001110110

h4 = 11000011110100101110000111110000

Step 1: Pick a string

A Test

Step 2: Break it into characters

A



T

e

s

t

Step 3: Convert characters to ASCII codes

65

32

84

101

115

116

Step 4: Convert numbers into binary

01000001

00100000

01010100

01100101

01110011

01110100

Step 5: Add '1' to the end

010000010010000001010100011001010111001101110100

010000010010000001010100011001010111001101110100 1

Step 6: Append '0's' to the end

0­1­0­0­0­0­0­1­0­0­1­0­0­0­0­0­0­1­0­1­0­1­0­0­0­1­1­0­0­1­0­1­0­1­1­1­0­0­1­1­0­1­1­1­0­1­0­0­1­ 0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­

Step 6.1: Append original message length

0­1­0­0­0­0­0­1­0­0­1­0­0­0­0­0­0­1­0­1­0­1­0­0­0­1­1­0­0­1­0­1­0­1­1­1­0­0­1­1­0­1­1­1­0­1­0­0­1­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­ 0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­1­1­0­0­0­0­

Step 7: 'Chunk' the message

0­1­0­0­0­0­0­1­0­0­1­0­0­0­0­0­0­1­0­1­0­1­0­0­0­1­1­0­0­1­0­1­0­1­1­1­0­0­1­1­0­1­1­1­0­1­0­0­1­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­1­1­0­0­0­0­

Step 8: Break the 'Chunk' into 'Words'

0: 01000001001000000101010001100101

1: 01110011011101001000000000000000

2: 00000000000000000000000000000000

3: 00000000000000000000000000000000

4: 00000000000000000000000000000000

5: 00000000000000000000000000000000

6: 00000000000000000000000000000000

7: 00000000000000000000000000000000

8: 00000000000000000000000000000000

9: 00000000000000000000000000000000

10: 00000000000000000000000000000000

11: 00000000000000000000000000000000

12: 00000000000000000000000000000000

13: 00000000000000000000000000000000

14: 00000000000000000000000000000000

15: 00000000000000000000000000110000

Step 9: 'Extend' into 80 words

Step 9.1: XOR

0: 01000001001000000101010001100101

2: 00000000000000000000000000000000

8: 00000000000000000000000000000000

13: 00000000000000000000000000000000

:

1011010101

:

0101001011

example XOR

Out: 1110011110

13:

00000000000000000000000000000000

8:

00000000000000000000000000000000

13 XOR 8

Out: 00000000000000000000000000000000

:

00000000000000000000000000000000

2:

00000000000000000000000000000000

(13 XOR 8) XOR 2

Out: 00000000000000000000000000000000

:

00000000000000000000000000000000

0:

01000001001000000101010001100101

((13 XOR 8) XOR 2) XOR 0

Out: 01000001001000000101010001100101

Step 9.2: Left rotate

01000001001000000101010001100101

10000010010000001010100011001010

0: 01000001001000000101010001100101

1: 01110011011101001000000000000000

2: 00000000000000000000000000000000

3: 00000000000000000000000000000000

4: 00000000000000000000000000000000

5: 00000000000000000000000000000000

6: 00000000000000000000000000000000

7: 00000000000000000000000000000000

8: 00000000000000000000000000000000

9: 00000000000000000000000000000000

10: 00000000000000000000000000000000

11: 00000000000000000000000000000000

12: 00000000000000000000000000000000

13: 00000000000000000000000000000000

14: 00000000000000000000000000000000

15: 00000000000000000000000000110000

16: 10000010010000001010100011001010

17: 11100110111010010000000000000000

18: 00000000000000000000000001100000

19: 00000100100000010101000110010101

20: 11001101110100100000000000000001

21: 00000000000000000000000011000000

22: 00001001000000101010001100101010

23: 10011011101001000000000001100011

24: 00000100100000010101000000010101

25: 11011111110101110100011001010101

26: 00110111010010000000000000000111

27: 00000000000000000000001100000000

28: 00100100000010101000110010101000

29: 01101110100100000000000111101110

30: 00010110100001000001000111000001

31: 10110010100011110001100111110110

32: 11010000101000111111001010100011

33: 01010110011101100000110000000010

34: 10010000001010100011001100100000

35: 10101000010001010100000111101101

36: 01101101010110000100011100000011

37: 11001010001111000110010011011010

38: 01100110100001010100011000100111

39: 00110111010010000011000110000111

40: 01010010101011011000110011010110

41: 11011110010010000001111011100001

42: 01101000010000010001110000010001

43: 00101000111100011001111110101011

44: 00000011001111011000100100010111

45: 11111100110001001100000110100110

46: 00010000101001100111010111011101

47: 10100001000110010101101011001001

48: 11011101110000010001100111100111

49: 01100001101110100100110110100110

50: 01101000010101000110010111110110

51: 00101110100100110100011011110111

52: 11010010101101011000101100101010

53: 11010011110010011110001000011010

54: 00010100001110111111001110110110

55: 00110101010110011111110100001011

56: 01101001110010001101011001110100

57: 00000110011100000111111010110101

58: 01101100111000100001101111110110

59: 00100110110111011001110100011101

60: 10001110101111000001001010101011

61: 11000101111011001100010100000111

62: 11111111000000100000010100100011

63: 11110110100011011111000110011110

64: 00110011011000101101111011000100

65: 01101100101101101110000110001111

66: 01000001000111000000100101101000

67: 11010001110010111100111001101001

68: 01001001000010010001011101110000

69: 11000100110000011010011011111100

70: 10100110011101011101110100010000

71: 00011001010110101100101010100001

72: 11100101000100110110101101110101

73: 11010100110111011011111001101111

74: 01110100001100011001010100101001

75: 10101111110100111111101000001101

76: 11011000110101010111110100101111

77: 00000111001000100000111010011001

78: 10001011100011011111100111110101

79: 10110111011010010100111100111110

Step 10: Initialize some variables

A = h0

B = h1

C = h2

D = h3

E = h4

Step 11: The main loop

Step 11.1: Four choices

Function 1

B:

11101111110011011010101110001001

C:

10011000101110101101110011111110

B AND C

Out: 10001000100010001000100010001000

!B:

00010000001100100101010001110110

D:

00010000001100100101010001110110

!B AND D

Out: 00010000001100100101010001110110

B AND C:

10001000100010001000100010001000

!B AND D:

00010000001100100101010001110110

(B AND C) OR (!B AND D)

F: 10011000101110101101110011111110

Function 2

B:

11011100100010001001111001110101

C:

10110101000101000100100011110000

B XOR C

Out: 01101001100111001101011010000101

B XOR C:

01101001100111001101011010000101

D:

01001110101011001011101010110111

(B XOR C) XOR D

F: 00100111001100000110110000110010

Function 3

B:

01000100110000000111111001110111

C:

00011010100110110011101010111011

B AND C

Out: 00000000100000000011101000110011

B:

01000100110000000111111001110111

D:

01010011011001010110101011100100

B AND D

Out: 01000000010000000110101001100100

C:

00011010100110110011101010111011

D:

01010011011001010110101011100100

C AND D

Out: 00010010000000010010101010100000

B AND C:

00000000100000000011101000110011

B AND D:

01000000010000000110101001100100

(B AND C) OR (B AND D)

Out: 01000000110000000111101001110111

(B AND C) OR (B AND D):

01000000110000000111101001110111

C AND D:

00010010000000010010101010100000

((B AND C) OR (B AND D)) OR (C AND D)

F: 01010010110000010111101011110111

Function 4

Step 11.2: Put them together

A lrot 5:

00110001000100010000101101110100

F:

10001011110000011101111100100001

A lrot 5 + F

Out: 110111100110100101110101010010101

A lrot 5 + F:

110111100110100101110101010010101

E:

11101001001001111110100110101011

A lrot 5 + F + E

Out: 1010100101111110101101010001000000

A lrot 5 + F + E:

1010100101111110101101010001000000

K:

11001010011000101100000111010110

A lrot 5 + F + E + K

Out: 11101110000010111011001011000010110

A lrot 5 + F + E + K:

11101110000010111011001011000010110

Word 79:

10110111011010010100111100111110

A lrot 5 + F + E

Out: 100000100111110001101110010101010100

32-bit temp:

00100111110001101110010101010100

E = D

D = C

C = B Left Rotate 30

B = A

A = temp

Step 12: The end

h0 = h0 + A

h1 = h1 + B

h2 = h2 + C

h3 = h3 + D

h4 = h4 + E

h0 = 10001111000011000000100001010101

h1 = 10010001010101100011001111100100

h2 = 10100111110111100001100101000110

h3 = 10001011001110000111010011001000

h4 = 10010000000111011111000001000011

8f0c0855

915633e4

a7de1946

8b3874c8

901df043

8f0c0855915633e4a7de19468b3874c8901df043