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

这段代码已经在networking上浮动了好几年 – 显然它能够提供一个密码来解密你不知道密码的excel电子表格。

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

我对这是如何工作感兴趣,但我似乎无法解决这个问题。 我假设它是以一定的数值​​encryption的(网上的一些地方说会给你原来的密码或者另一个可以工作的),就像公钥一样 – 你可以有100个公共密钥,所有的私人密钥都可以工作。

对我来说,它似乎是创build整型variables,并填充一个特定的数字,然后将该数字转换成相关的字符。 这些总是不一样吗? 如果有的话,Excel保护是否有“主密码”?

谢谢大家!

编辑:我已经注意到在我发布的示例代码中n = 32到126 。 交叉引用一个ASCII表,似乎是从空间到代字符的所有字符。 这是一种字典攻击,我不明白,因为语法?

这是一个小小的世界,正如代码所示,我在10年前的另一个论坛上发布了这个代码,并在其他地方看到了它 – 我想在John Walkenbach的旧网站

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

  • 这个完整的例子是这里 (截图如下)
  • 谷歌searchexcel sheet protection “test” and “zzyw”给出了这样从汤姆·乌蒂斯其他参考

在这里输入图像说明

引人入胜 – 我知道以前的代码片段,但不是brettdj发布的解释。 正如其他人所解释的那样,这是对散列冲突的powershellsearch。 实际上它似乎是通过反复试验得出的,因为它做了比必要的更多的工作(产生了194560个组合,但是只有32768个散列值是可能的)。

简而言之,Excel的散列algorithm(如http://chicago.sourceforge.net/devel/docs/excel/encrypt.html中所解释的):

  1. 以密码的每个字符的ascii代码。
  2. 将其视为一个16位有符号的数字。 根据字符的位置向左移位(第一个字符为1位,第二个为2,依此类推)
  3. 将所有字符异或,给出一个16位有符号int> = 0。
  4. 异或结果与密码的长度和幻数。

知道这一点,可以devise如下的蛮力search:

  • 最高位始终为零,所以有15位要testing。
  • 将它们分成三个计数器,每个计数器覆盖5位。 这样每个计数器可以代表一个可打印的ASCII字符。
  • 将这些计数器的ascii表示forms包含在密码string中,以避免相互影响。

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

 bit: 76543210 76543210 cnt: -zzzzyyy yyxxxxxz 

XOR操作可以被忽略,因为XOR参数始终是恒定的。 出于同样的原因,可以添加一个常数偏移量(例如64)。 另外,在其他密码字节(2-5,7-10)上使用什么字符也无关紧要。

通过迭代x,y,z的所有可能的组合,最终find一个与原来的hash值相同的密码。

 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 

只是一个猜测,但它在我看来像Exceltesting密码是否有效通过运行一些散列函数,产生一个相当小的范围的结果,并与存储的哈希值进行比较。

假设这个函数正在做的是testing所有这些值直到find一个有效的值。 根据所使用的值来判断,散列函数产生2 ^ 11 *(126-31)个不同的值,所有这些都可以由这个代码生成的值产生。

我的分析假定这个例程工作。 我没有testing过。

代码使用encryption密码AAAAAAAAAAA(SPACE)到BBBBBBBBBBB(〜)进行蛮力search,其中(SPACE)是空格字符(CHR(32)),(〜)当然是字符126.当find密码时在消息框中显示密码。

当然,这意味着它只能检查长度恰好为12个字符的密码,并且只能包含大写字母A(ASCII 65)和B(ASCII 66),后跟一个可打印的ASCII字符。 @mkingston是正确的,它testing2 ^ 11 *(126-31)不同的值。 但是没有哈希函数。 我不认为这会破解很多电子表格。 您最好使用AccessData中的这些程序之一 。

有关ActiveSheet.Protect和ActiveSheet.Unprotect的更多详细信息,请参阅http://msdn.microsoft.com/en-us/library/office/aa191957(v=office.10).aspx 。

 Sub FindPassword() 'Breaks worksheet password protection. Dim i As Integer, j As Integer, k As Integer Dim l As Integer, m As Integer, n As Integer Dim i1 As Integer, i2 As Integer, i3 As Integer Dim i4 As Integer, i5 As Integer, i6 As Integer On Error Resume Next For i = 65 To 66: For j = 65 To 66: For k = 65 To 66 For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66 For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66 For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126 ActiveSheet.Unprotect Chr(i) & Chr(j) & Chr(k) & _ Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _ Chr(i4) & Chr(i5) & Chr(i6) & Chr(n) If ActiveSheet.ProtectContents = False Then MsgBox "One usable password is " & Chr(i) & Chr(j) & _ Chr(k) & Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & _ Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n) Exit Sub End If Next: Next: Next: Next: Next: Next Next: Next: Next: Next: Next: Next End Sub