Excel的工作表密码保护如何工作

And*_*ite 15 encryption excel vba excel-vba

这段代码已经在网上漂浮了很多年 - 它显然能够提供密码来解密你不知道密码的excel电子表格.

http://www.theofficeexperts.com/VBASamples/Excel02.htm

我对它是如何工作感兴趣,但我似乎无法解决这个问题.我假设它是在某个值下加密的,可以通过多种方式获得(网上的一些地方说它会给你原始密码或另一个可以工作的密码)有点像公钥 - 你可以有100个公钥,所有公钥都可以使用一个私钥.

对我来说,似乎它正在创建整数变量并用特定数字填充它们,然后将该数字转换为相关字符.这些总是不一样吗?如果是这样,Excel保护是否有"主密码"?

谢谢大家!

编辑:我注意到我发布的示例代码中的For n = 32 To 126.使用ASCII表进行交叉引用,该表似乎是从空间到波浪号的所有字符.这是某种字典攻击我不理解语法吗?

bre*_*tdj 22

这是一个小世界,因为代码表明我在大约10年前在另一个论坛上发布了这个代码,在其他地方看过它 - 我想在John Walkenbach的旧网站上

请务必注意,此代码保护仅适用于工作表保护 - 而不适用于Excel的文件打开或VBA密码.

在此输入图像描述


Tor*_*ein 11

引人入胜 - 我之前知道代码片段,但不知道brettdj发布的解释.正如其他人所解释的那样,它是对哈希冲突的蛮力搜索.实际上它似乎是通过反复试验制作的,因为它做了比必要工作更多的工作(生成了194560个组合,但是只有32768个哈希值可能.)

简而言之Excel的哈希算法(如http://chicago.sourceforge.net/devel/docs/excel/encrypt.html中所述):

  1. 取密码的每个字符的ascii代码.
  2. 将其视为16位带符号的数字.根据字符的位置将其位向左移位(第一个字符为1位,第二个字符为2,依此类推)
  3. 将所有字符放在一起,得到一个16位有符号的int> = 0.
  4. XOR,结果是密码长度和幻数.

知道这一点,人们可以设计如下的蛮力搜索:

  • 最高位始终为零,因此需要测试15位.
  • 将它们分成三个计数器,每个计数器覆盖5位.这样每个计数器都可以代表一个可打印的ascii字符.
  • 将这些计数器的ascii表示形式包装在密码字符串中,使它们不会相互影响.

最简单的方法是使用11个字符的密码并将计数器放在位置1,6和11处.步骤2中的位移以正确的方式对齐计数器位:第一个计数器("x")移位1位,第二个("y")6位,第三个("z")11位.在散列的按位表示中,计数器会影响以下位:

bit: 76543210 76543210
cnt: -zzzzyyy yyxxxxxz
Run Code Online (Sandbox Code Playgroud)

由于XOR参数始终是常量,因此可以忽略XOR运算.出于同样的原因,可以添加常数偏移(例如64).另外,在其他密码字节(2-5,7-10)上使用什么字符也无关紧要.

通过迭代x,y,z的所有可能组合,您最终会找到一个密码,该密码提供与原始密码相同的哈希值.

Public Sub demo()
    ' http://stackoverflow.com/questions/12852095/how-does-excels-worksheet-password-protection-work
    Dim x As Integer, y as Integer, z as Integer
    Dim part1 As String, part12 As String
    Dim sh As Worksheet
    Set sh = ThisWorkbook.Worksheets(1)

    sh.Protect "$ome_Insanely_Long_and_c0mplex_password! [(which i$ imp*ssible t0 re-member)]"

    For x = 64 To 95
        ' pad with dots, so that x, y and z affect nonoverlapping bits of the hash.
        part1 = Chr(x) + "...."
        For y = 64 To 95
            part12 = part1 + Chr(y) + "...."
            For z = 64 To 95
                On Error Resume Next
                    sh.Unprotect part12 + Chr(z)
                    If Err.Number = 0 Then
                        Debug.Print "Password: '" & part12 + Chr(z) & "'"
                        Exit Sub
                    End If
                On Error GoTo 0
            Next
        Next
    Next
End Sub
Run Code Online (Sandbox Code Playgroud)

  • 我尝试时,此代码无效.但是,[本页](http://www.mcgimpsey.com/excel/removepwords.html)包含一个程序(由Norman Harker和JE McGimpsey修改)来解锁受保护的表格(并且它运作良好). (2认同)
  • 这是迄今为止我所见过的最好的解释,从技术上讲,这是唯一正确的解释,因为它可以将可能的“密码”的真实数量标识为2 ^ 15 =32768。Excel的哈希函数是[Surjective Function](http:/ /en.wikipedia.org/wiki/Surjective_function),将大量输入密码映射到少量密码。Torben将输入密码的子集识别为一组可能的哈希值的[Bijective](http://en.wikipedia.org/wiki/Bijection),从而创建了通常复制的暴力破解工具的优化版本。 (2认同)