mSHA256源码:部分1 Attribute VB_Name = "mSHA256" Option Explicit '======================================== '【获取SHA-256模块】 '======================================== '================================ '声明模块变量 '================================ Private dwBitFill&(30) '位填充 Private dwPowerOfTwo&(30) '2的n次幂 Private k&(63) '================================ '声明模块常量 '================================ Private Const BITS_TO_A_BYTE As Long = 8 '字节包含位常数: 1 Byte = 8 Bits Private Const BYTES_TO_A_WORD As Long = 4 '双字包含字节常数:1 DWord = 4 Bytes Private Const BITS_TO_A_WORD As Long = 32 '双字包含位常数: 1 DWord = 32 Bits '================================ '主函数过程 '================================ '======================== '获取文件或字符串SHA-256值 '======================== Public Function SHA256(ByRef sInput As String, Optional ByVal IsFile As Boolean = False) As String '声明变量 Dim a&, b&, c&, d&, e&, f&, g&, h& Dim i&, j& Dim T1& Dim T2& Dim dwBytes& Dim sRet$ Dim bArr() As Byte Dim dwArr() As Long Dim HASH&(7) Dim W&(63) '初始化 Call Init HASH(0) = &H6A09E667 HASH(1) = &HBB67AE85 HASH(2) = &H3C6EF372 HASH(3) = &HA54FF53A HASH(4) = &H510E527F HASH(5) = &H9B05688C HASH(6) = &H1F83D9AB HASH(7) = &H5BE0CD19 '处理参数 If IsFile Then dwBytes = getBytes(sInput, bArr) Else dwBytes = toBytes(sInput, bArr) End If '转换字节数组为32位双字矩阵 Call ToDWordArr(dwArr, bArr, dwBytes) For i = 0 To UBound(dwArr) Step 16 a = HASH(0) b = HASH(1) c = HASH(2) d = HASH(3) e = HASH(4) f = HASH(5) g = HASH(6) h = HASH(7) For j = 0 To 63 If j < 16 Then W(j) = dwArr(j + i) Else W(j) = AddUnsigned(AddUnsigned(AddUnsigned(Gamma1(W(j - 2)), W(j - 7)), Gamma0(W(j - 15))), W(j - 16)) End If T1 = AddUnsigned(AddUnsigned(AddUnsigned(AddUnsigned(h, Sigma1(e)), Ch(e, f, g)), k(j)), W(j)) T2 = AddUnsigned(Sigma0(a), Maj(a, b, c)) h = g g = f f = e e = AddUnsigned(d, T1) d = c c = b b = a a = AddUnsigned(T1, T2) Next HASH(0) = AddUnsigned(a, HASH(0)) HASH(1) = AddUnsigned(b, HASH(1)) HASH(2) = AddUnsigned(c, HASH(2)) HASH(3) = AddUnsigned(d, HASH(3)) HASH(4) = AddUnsigned(e, HASH(4)) HASH(5) = AddUnsigned(f, HASH(5)) HASH(6) = AddUnsigned(g, HASH(6)) HASH(7) = AddUnsigned(h, HASH(7)) Next sRet = "" For i = 0 To 7 sRet = sRet & Right("00000000" & Hex(HASH(i)), 8) Next SHA256 = LCase(sRet)End Function
关于文件拖拽部分代码: Private Sub boxMsg_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single) Dim sFile$ sFile = Data.Files(1) boxMsg = sFile IsStrHash = False End Sub