Excel VBA 的密码哈希函数

2023-11-29

我需要一个用 Excel VBA 编写的函数,该函数将使用标准算法(例如 SHA-1)对密码进行哈希处理。具有简单界面的东西,例如:

Public Function CreateHash(Value As String) As String
...
End Function

该功能需要在安装了 Excel 2003 的 XP 工作站上运行,但不能使用任何第三方组件。它可以引用和使用 XP 中可用的 DLL,例如 CryptoAPI。

有谁知道实现此哈希功能的示例?


这是一个用于计算 SHA1 哈希值的模块,可用于 Excel 公式,例如。 '=SHA1HASH("测试")'。要使用它,请创建一个名为“module_sha1”的新模块并将其全部复制并粘贴到其中。 这是基于一些 VBA 代码http://vb.wikia.com/wiki/SHA-1.bas,进行了更改以支持向其传递字符串,并可以从 Excel 单元格中的公式执行。

' Based on: http://vb.wikia.com/wiki/SHA-1.bas
Option Explicit

Private Type FourBytes
    A As Byte
    B As Byte
    C As Byte
    D As Byte
End Type
Private Type OneLong
    L As Long
End Type

Function HexDefaultSHA1(Message() As Byte) As String
 Dim H1 As Long, H2 As Long, H3 As Long, H4 As Long, H5 As Long
 DefaultSHA1 Message, H1, H2, H3, H4, H5
 HexDefaultSHA1 = DecToHex5(H1, H2, H3, H4, H5)
End Function

Function HexSHA1(Message() As Byte, ByVal Key1 As Long, ByVal Key2 As Long, ByVal Key3 As Long, ByVal Key4 As Long) As String
 Dim H1 As Long, H2 As Long, H3 As Long, H4 As Long, H5 As Long
 xSHA1 Message, Key1, Key2, Key3, Key4, H1, H2, H3, H4, H5
 HexSHA1 = DecToHex5(H1, H2, H3, H4, H5)
End Function

Sub DefaultSHA1(Message() As Byte, H1 As Long, H2 As Long, H3 As Long, H4 As Long, H5 As Long)
 xSHA1 Message, &H5A827999, &H6ED9EBA1, &H8F1BBCDC, &HCA62C1D6, H1, H2, H3, H4, H5
End Sub

Sub xSHA1(Message() As Byte, ByVal Key1 As Long, ByVal Key2 As Long, ByVal Key3 As Long, ByVal Key4 As Long, H1 As Long, H2 As Long, H3 As Long, H4 As Long, H5 As Long)
 'CA62C1D68F1BBCDC6ED9EBA15A827999 + "abc" = "A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D"
 '"abc" = "A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D"

 Dim U As Long, P As Long
 Dim FB As FourBytes, OL As OneLong
 Dim i As Integer
 Dim W(80) As Long
 Dim A As Long, B As Long, C As Long, D As Long, E As Long
 Dim T As Long

 H1 = &H67452301: H2 = &HEFCDAB89: H3 = &H98BADCFE: H4 = &H10325476: H5 = &HC3D2E1F0

 U = UBound(Message) + 1: OL.L = U32ShiftLeft3(U): A = U \ &H20000000: LSet FB = OL 'U32ShiftRight29(U)

 ReDim Preserve Message(0 To (U + 8 And -64) + 63)
 Message(U) = 128

 U = UBound(Message)
 Message(U - 4) = A
 Message(U - 3) = FB.D
 Message(U - 2) = FB.C
 Message(U - 1) = FB.B
 Message(U) = FB.A

 While P < U
     For i = 0 To 15
         FB.D = Message(P)
         FB.C = Message(P + 1)
         FB.B = Message(P + 2)
         FB.A = Message(P + 3)
         LSet OL = FB
         W(i) = OL.L
         P = P + 4
     Next i

     For i = 16 To 79
         W(i) = U32RotateLeft1(W(i - 3) Xor W(i - 8) Xor W(i - 14) Xor W(i - 16))
     Next i

     A = H1: B = H2: C = H3: D = H4: E = H5

     For i = 0 To 19
         T = U32Add(U32Add(U32Add(U32Add(U32RotateLeft5(A), E), W(i)), Key1), ((B And C) Or ((Not B) And D)))
         E = D: D = C: C = U32RotateLeft30(B): B = A: A = T
     Next i
     For i = 20 To 39
         T = U32Add(U32Add(U32Add(U32Add(U32RotateLeft5(A), E), W(i)), Key2), (B Xor C Xor D))
         E = D: D = C: C = U32RotateLeft30(B): B = A: A = T
     Next i
     For i = 40 To 59
         T = U32Add(U32Add(U32Add(U32Add(U32RotateLeft5(A), E), W(i)), Key3), ((B And C) Or (B And D) Or (C And D)))
         E = D: D = C: C = U32RotateLeft30(B): B = A: A = T
     Next i
     For i = 60 To 79
         T = U32Add(U32Add(U32Add(U32Add(U32RotateLeft5(A), E), W(i)), Key4), (B Xor C Xor D))
         E = D: D = C: C = U32RotateLeft30(B): B = A: A = T
     Next i

     H1 = U32Add(H1, A): H2 = U32Add(H2, B): H3 = U32Add(H3, C): H4 = U32Add(H4, D): H5 = U32Add(H5, E)
 Wend
End Sub

Function U32Add(ByVal A As Long, ByVal B As Long) As Long
 If (A Xor B) < 0 Then
     U32Add = A + B
 Else
     U32Add = (A Xor &H80000000) + B Xor &H80000000
 End If
End Function

Function U32ShiftLeft3(ByVal A As Long) As Long
 U32ShiftLeft3 = (A And &HFFFFFFF) * 8
 If A And &H10000000 Then U32ShiftLeft3 = U32ShiftLeft3 Or &H80000000
End Function

Function U32ShiftRight29(ByVal A As Long) As Long
 U32ShiftRight29 = (A And &HE0000000) \ &H20000000 And 7
End Function

Function U32RotateLeft1(ByVal A As Long) As Long
 U32RotateLeft1 = (A And &H3FFFFFFF) * 2
 If A And &H40000000 Then U32RotateLeft1 = U32RotateLeft1 Or &H80000000
 If A And &H80000000 Then U32RotateLeft1 = U32RotateLeft1 Or 1
End Function
Function U32RotateLeft5(ByVal A As Long) As Long
 U32RotateLeft5 = (A And &H3FFFFFF) * 32 Or (A And &HF8000000) \ &H8000000 And 31
 If A And &H4000000 Then U32RotateLeft5 = U32RotateLeft5 Or &H80000000
End Function
Function U32RotateLeft30(ByVal A As Long) As Long
 U32RotateLeft30 = (A And 1) * &H40000000 Or (A And &HFFFC) \ 4 And &H3FFFFFFF
 If A And 2 Then U32RotateLeft30 = U32RotateLeft30 Or &H80000000
End Function

Function DecToHex5(ByVal H1 As Long, ByVal H2 As Long, ByVal H3 As Long, ByVal H4 As Long, ByVal H5 As Long) As String
 Dim H As String, L As Long
 DecToHex5 = "00000000 00000000 00000000 00000000 00000000"
 H = Hex(H1): L = Len(H): Mid(DecToHex5, 9 - L, L) = H
 H = Hex(H2): L = Len(H): Mid(DecToHex5, 18 - L, L) = H
 H = Hex(H3): L = Len(H): Mid(DecToHex5, 27 - L, L) = H
 H = Hex(H4): L = Len(H): Mid(DecToHex5, 36 - L, L) = H
 H = Hex(H5): L = Len(H): Mid(DecToHex5, 45 - L, L) = H
End Function

' Convert the string into bytes so we can use the above functions
' From Chris Hulbert: http://splinter.com.au/blog

Public Function SHA1HASH(str)
  Dim i As Integer
  Dim arr() As Byte
  ReDim arr(0 To Len(str) - 1) As Byte
  For i = 0 To Len(str) - 1
   arr(i) = Asc(Mid(str, i + 1, 1))
  Next i
  SHA1HASH = Replace(LCase(HexDefaultSHA1(arr)), " ", "")
End Function
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Excel VBA 的密码哈希函数 的相关文章

随机推荐

  • pandas 数据框中的数据透视表

    我有一个要求 我试图计算值并将它们放入数据透视表中 这是我的数据框 Cola Colb Apple Rippened Orange Rippened Apple UnRippened Mango UnRippened 我希望输出是这样的 R
  • 使用谷歌地图 API 从 iPhone 进行反向地理编码纬度/经度

    我目前正在使用谷歌地图的反向地理编码 API 将从 iPhone 的 CoreLocation API 接收到的经 纬度转换为谷歌应用程序引擎服务器上的城市 州信息 这会被视为违反条款吗 我做了一些研究 但找不到这个问题的直接答案 现在 我
  • 合并重叠区间

    目前 我的间隔时间为 temp tuple 25 14 21 16 20 15 10 7 8 5 6 3 2 4 2 3 3 6 12 15 13 18 14 17 22 27 25 30 26 29 按下限升序排列 我的任务是合并重叠的间
  • 在 Jersey 1.19.1 上禁用 WADL 生成

    我在一个带有 Java Jboss 的 Web 项目中使用 Jersey 1 19 1 每次我从 Web 服务请求某些内容时 它都会在 server log 上显示此条目 ERROR STDERR com sun jersey server
  • Android 上未找到类异常

    我从网上得到了一些酸味 并导入到我的工作区 当我在模拟器上运行时 它会抛出 05 28 17 30 47 895 E AndroidRuntime 840 java lang RuntimeException Unable to insta
  • Yajra Laravel 数据表 - 合并列值

    我已将 Yajra Datatables 包含在我的 Laravel 项目中并且工作正常 问题是我需要合并 3 个列值并将它们显示为 1 并允许同时搜索 我怎么做 我能够使用渲染功能并在单列中显示数据 但那么如何搜索呢 Mysql 表示例
  • 使用 InnerJoin Firebird 删除语句

    我创建此 select 语句是为了查找要删除的重复行 我虽然只是将 SELECT TO DELETE 更改为它会删除行 但事实并非如此 这是选择语句 select FROM MYCARD T1 INNER JOIN SELECT IDCAR
  • Delphi - 恢复 DBGrid 中的实际行

    D6 prof 以前我们使用DBISAM 和DBISAMTable 它处理 RecNo 并且可以很好地进行修改 删除 编辑等 现在我们用 ElevateDB 替换 它不处理 RecNo 而且很多时候我们使用查询 而不是表 必须重新打开查询才
  • 如何在 Rust WASI 中链接 C 库

    我想在我的 rust wasi 程序中使用 C 库 但我在链接外部库时遇到问题 我当前的设置是这样的 main rs link name mylib extern C pub fn add one i i32 gt i32 pub fn m
  • C-检查输入(浮点数)是纯整数还是浮点数

    我想检查用户输入是纯整数还是浮点数 我试图通过使用来做到这一点floor and ceilf并将这些值与函数中的原始 x 值进行比较 然而 这似乎有点问题 因为对于某些数字 如 5 5 该函数不断返回 0 而不是 1 当floor 5 5
  • Javascript:单词到数字[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 如何在 JavaScript 中将单词转换为数字 示例 从现在起 19 天 将变为 从现在起 19 天 我可以使用 jQuery 或其他库 如果不是 jQuery 希望是一个较小
  • Elasticsearch中的聚合+排序+分页

    我需要在其中一个索引中进行聚合 排序 分页 我了解了 Elastic search 的内部功能 我总共有 5 个分片 它将对各个分片进行排序并获取结果 默认情况下每个分片将返回 10 条记录 然后这 50 条记录再次排序 它将获取前 10
  • 存储应用程序参数的最佳位置在哪里:数据库、文件、代码...?

    我正在开发一个 Ruby on Rails 网站 我有一个 架构 问题 我的应用程序需要一些参数 我想知道在哪里存储它们 具体而言 我的应用程序收到一些请求 这些请求经过评估然后发送 因此 请求模型必须具有与这些处理相关的属性 验证状态 a
  • 使用正则表达式将单引号替换为双引号

    我有一个应用程序收到了格式错误的 JSON 字符串 如下所示 username xirby 我需要替换单引号 带双引号 有了这些规则 我认为 单引号位于 有一个或多个空格 出现在一个或多个空格之前并且 出现在 多一个空格 出现在一个或多个空
  • Xcode 13 AppleScript 框架无法将 UI 连接到 Applescript 代码

    尝试使用 Xcode 13 和 AppleScript 框架为 MacOS 11 5 创建 AppleScript 可执行文件 开箱即用 我没有进行任何处理 IB 显示屏上的委托图标并不指向默认的 AppleScript 代码 这是很清楚的
  • 无法使用 VHDL 2008 Quartus Prime 进行编译

    我正在使用 Quartus Prime Lite Edition 并且我想使用一元运算符nand像这样的 std logic vector library ieee use ieee std logic 1164 all use ieee
  • dend_rank 和 sqlite - 可能吗?

    我的情况是我有一个PostgresSQL数据库非常小 大约 10 个表 其中最大的是几千行 我想从单用户样式应用程序中使用它 因此必须安装整个服务器感觉不必要的繁重 所以 我想 好吧SQLite听起来这只是门票 我移植了架构 导入了数据 然
  • HTTPS 请求,指定主机名和特定 IP 地址

    我的应用程序服务器有一个基于 Node js 的部署脚本 部署过程中的第一步是验证这些应用程序服务器在向 DNS 注册之前是否正确侦听 HTTPS 为此 我只需向该服务器的 IP 地址发出 HTTPS 请求即可 如果这是 HTTP 那就不是
  • 为什么 _exit(0) (通过系统调用退出)阻止我接收任何标准输出内容?

    我有一个 Linux x86 32 GAS 汇编程序 如下所示终止 movl 1 eax movl 0 ebx argument for exit int 0x80 当我像这样退出时 程序会像平常一样运行 但是如果我尝试读取标准输出输出 我
  • Excel VBA 的密码哈希函数

    我需要一个用 Excel VBA 编写的函数 该函数将使用标准算法 例如 SHA 1 对密码进行哈希处理 具有简单界面的东西 例如 Public Function CreateHash Value As String As String E