Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ' Author Unknown by me
- Function SHA(ByVal sMessage)
- Dim i, result(32), temp(8) As Double, fraccubeprimes, hashValues
- Dim done512, index512, words(64) As Double, index32, mask(4)
- Dim s0, s1, t1, t2, maj, ch, strLen
- mask(0) = 4294967296#
- mask(1) = 16777216
- mask(2) = 65536
- mask(3) = 256
- hashValues = Array( _
- 1779033703, 3144134277#, 1013904242, 2773480762#, _
- 1359893119, 2600822924#, 528734635, 1541459225)
- fraccubeprimes = Array( _
- 1116352408, 1899447441, 3049323471#, 3921009573#, 961987163, 1508970993, 2453635748#, 2870763221#, _
- 3624381080#, 310598401, 607225278, 1426881987, 1925078388, 2162078206#, 2614888103#, 3248222580#, _
- 3835390401#, 4022224774#, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, _
- 2554220882#, 2821834349#, 2952996808#, 3210313671#, 3336571891#, 3584528711#, 113926993, 338241895, _
- 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350#, 2456956037#, _
- 2730485921#, 2820302411#, 3259730800#, 3345764771#, 3516065817#, 3600352804#, 4094571909#, 275423344, _
- 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, _
- 1955562222, 2024104815, 2227730452#, 2361852424#, 2428436474#, 2756734187#, 3204031479#, 3329325298#)
- sMessage = Nz(sMessage, "")
- strLen = Len(sMessage) * 8
- sMessage = sMessage & Chr(128)
- done512 = False
- index512 = 0
- 31. If (Len(sMessage) Mod 64) < 56 Then
- 32. sMessage = sMessage & String(56 - (Len(sMessage) Mod 64), Chr(0))
- 33. ElseIf (Len(sMessage) Mod 64) > 56 Then
- 34. sMessage = sMessage & String(120 - (Len(sMessage) Mod 64), Chr(0))
- 35. End If
- 36. sMessage = sMessage & Chr(0) & Chr(0) & Chr(0) & Chr(0)
- 37.
- 38. sMessage = sMessage & Chr(Int((strLen / mask(0) - Int(strLen / mask(0))) * 256))
- 39. sMessage = sMessage & Chr(Int((strLen / mask(1) - Int(strLen / mask(1))) * 256))
- 40. sMessage = sMessage & Chr(Int((strLen / mask(2) - Int(strLen / mask(2))) * 256))
- 41. sMessage = sMessage & Chr(Int((strLen / mask(3) - Int(strLen / mask(3))) * 256))
- 42.
- 43. Do Until done512
- 44. For i = 0 To 15
- 45. words(i) = Asc(Mid(sMessage, index512 * 64 + i * 4 + 1, 1)) * mask(1) + Asc(Mid(sMessage, index512 * 64 + i * 4 + 2, 1)) * mask(2) + Asc(Mid(sMessage, index512 * 64 + i * 4 + 3, 1)) * mask(3) + Asc(Mid(sMessage, index512 * 64 + i * 4 + 4, 1))
- 46. Next
- 47.
- 48. For i = 16 To 63
- 49. s0 = largeXor(largeXor(rightRotate(words(i - 15), 7, 32), rightRotate(words(i - 15), 18, 32), 32), Int(words(i - 15) / 8), 32)
- 50. s1 = largeXor(largeXor(rightRotate(words(i - 2), 17, 32), rightRotate(words(i - 2), 19, 32), 32), Int(words(i - 2) / 1024), 32)
- 51. words(i) = Mod32Bit(words(i - 16) + s0 + words(i - 7) + s1)
- 52. Next
- 53.
- 54. For i = 0 To 7
- 55. temp(i) = hashValues(i)
- 56. Next
- 57.
- 58. For i = 0 To 63
- 59. s0 = largeXor(largeXor(rightRotate(temp(0), 2, 32), rightRotate(temp(0), 13, 32), 32), rightRotate(temp(0), 22, 32), 32)
- 60. maj = largeXor(largeXor(largeAnd(temp(0), temp(1), 32), largeAnd(temp(0), temp(2), 32), 32), largeAnd(temp(1), temp(2), 32), 32)
- 61. t2 = Mod32Bit(s0 + maj)
- 62. s1 = largeXor(largeXor(rightRotate(temp(4), 6, 32), rightRotate(temp(4), 11, 32), 32), rightRotate(temp(4), 25, 32), 32)
- 63. ch = largeXor(largeAnd(temp(4), temp(5), 32), largeAnd(largeNot(temp(4), 32), temp(6), 32), 32)
- 64. t1 = Mod32Bit(temp(7) + s1 + ch + fraccubeprimes(i) + words(i))
- 65.
- 66. temp(7) = temp(6)
- 67. temp(6) = temp(5)
- 68. temp(5) = temp(4)
- 69. temp(4) = Mod32Bit(temp(3) + t1)
- 70. temp(3) = temp(2)
- 71. temp(2) = temp(1)
- 72. temp(1) = temp(0)
- 73. temp(0) = Mod32Bit(t1 + t2)
- 74. Next
- 75.
- 76. For i = 0 To 7
- 77. hashValues(i) = Mod32Bit(hashValues(i) + temp(i))
- 78. Next
- 79.
- 80. If (index512 + 1) * 64 >= Len(sMessage) Then done512 = True
- 81. index512 = index512 + 1
- 82. Loop
- 83.
- 84. For i = 0 To 31
- 85. result(i) = Int((hashValues(i \ 4) / mask(i Mod 4) - Int(hashValues(i \ 4) / mask(i Mod 4))) * 256)
- 86. Next
- 87.
- 88. SHA = result
- 89. End Function
- 90.
- 91. Function Mod32Bit(value)
- 92. Mod32Bit = Int((value / 4294967296# - Int(value / 4294967296#)) * 4294967296#)
- 93. End Function
- 94.
- 95. Function rightRotate(value, amount, totalBits)
- 96. 'To leftRotate, make amount = totalBits - amount
- 97. Dim i
- 98. rightRotate = 0
- 99.
- 100. For i = 0 To (totalBits - 1)
- 101. If i >= amount Then
- 102. rightRotate = rightRotate + (Int((value / (2 ^ (i + 1)) - Int(value / (2 ^ (i + 1)))) * 2)) * 2 ^ (i - amount)
- 103. Else
- 104. rightRotate = rightRotate + (Int((value / (2 ^ (i + 1)) - Int(value / (2 ^ (i + 1)))) * 2)) * 2 ^ (totalBits - amount + i)
- 105. End If
- 106. Next
- 107. End Function
- 108.
- 109. Function largeXor(value, xorValue, totalBits)
- 110. Dim i, a, b
- 111. largeXor = 0
- 112.
- 113. For i = 0 To (totalBits - 1)
- 114. a = (Int((value / (2 ^ (i + 1)) - Int(value / (2 ^ (i + 1)))) * 2))
- 115. b = (Int((xorValue / (2 ^ (i + 1)) - Int(xorValue / (2 ^ (i + 1)))) * 2))
- 116. If a <> b Then
- 117. largeXor = largeXor + 2 ^ i
- 118. End If
- 119. Next
- 120. End Function
- 121.
- 122. Function largeNot(value, totalBits)
- 123. Dim i, a
- 124. largeNot = 0
- 125.
- 126. For i = 0 To (totalBits - 1)
- 127. a = Int((value / (2 ^ (i + 1)) - Int(value / (2 ^ (i + 1)))) * 2)
- 128. If a = 0 Then
- 129. largeNot = largeNot + 2 ^ i
- 130. End If
- 131. Next
- 132. End Function
- 133.
- 134. Function largeAnd(value, andValue, totalBits)
- 135. Dim i, a, b
- 136. largeAnd = 0
- 137.
- 138. For i = 0 To (totalBits - 1)
- 139. a = Int((value / (2 ^ (i + 1)) - Int(value / (2 ^ (i + 1)))) * 2)
- 140. b = (Int((andValue / (2 ^ (i + 1)) - Int(andValue / (2 ^ (i + 1)))) * 2))
- 141. If a = 1 And b = 1 Then
- 142. largeAnd = largeAnd + 2 ^ i
- 143. End If
- 144. Next
- 145. End Function
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement