Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何使用Excel';s工作表密码保护工作_Vba_Encryption_Excel - Fatal编程技术网

Vba 如何使用Excel';s工作表密码保护工作

Vba 如何使用Excel';s工作表密码保护工作,vba,encryption,excel,Vba,Encryption,Excel,这段代码已经在网上流传了好几年了——它显然能够提供一个密码,用于解密您不知道密码的excel电子表格 我对它的工作原理很感兴趣,但我似乎无法解决它。我假设它是在一个特定的值下加密的,这个值可以通过多种方式获得(网络上的一些地方说它会给你原始密码或另一个可以工作的密码),有点像公钥——你可以有100个公钥,所有这些公钥都可以与一个私钥一起工作 在我看来,它似乎是在创建整数变量并用特定的数字填充它们,然后再将该数字转换为相关字符。这些不都是一样的吗?如果是,是否有Excel保护的“主密码” 谢谢大

这段代码已经在网上流传了好几年了——它显然能够提供一个密码,用于解密您不知道密码的excel电子表格

我对它的工作原理很感兴趣,但我似乎无法解决它。我假设它是在一个特定的值下加密的,这个值可以通过多种方式获得(网络上的一些地方说它会给你原始密码或另一个可以工作的密码),有点像公钥——你可以有100个公钥,所有这些公钥都可以与一个私钥一起工作

在我看来,它似乎是在创建整数变量并用特定的数字填充它们,然后再将该数字转换为相关字符。这些不都是一样的吗?如果是,是否有Excel保护的“主密码”

谢谢大家


编辑:在我发布的示例代码中,我注意到了n=32到126之间的差异。与ASCII表的交叉引用,该表似乎是从空格到平铺的所有字符。这是一种由于语法原因我不理解的字典攻击吗?

只是一个猜测,但在我看来,如果密码通过某种哈希函数运行是有效的,它会产生非常小的结果范围,并将其与存储的哈希值进行比较,这就像Excel测试一样

假定这个函数正在测试所有这些值,直到找到一个有效的值为止。根据使用的值判断,哈希函数生成2^11*(126-31)个不同的值,所有这些值都可以由该代码中生成的值生成


我的分析假设这一常规有效。我还没有测试过。

代码使用加密密码aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa。找到密码后,会在消息框中显示密码

当然,这意味着它只检查长度正好为12个字符且仅由大写字母A(ASCII 65)和B(ASCII 66)后跟一个可打印ASCII字符组成的密码@mkingston测试2^11*(126-31)个不同的值是正确的。但是没有哈希函数。我不认为这会破坏很多电子表格。你最好用它


有关ActiveSheet.Protect和ActiveSheet.Unprotect的更多详细信息,请参阅。

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

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

  • 这篇文章完整的一个例子是(下面的屏幕截图)
  • 谷歌
    excel表单保护“test”和“zzyw”
    提供了其他类似的参考

编辑(2020):从Excel 2013开始,显然保护方案已经改变。因此,最初的答案不再具有历史意义

新的保护使得使用最先进的SHA-512散列几乎不可能检索密码。但是,如果你能在几秒钟内把它拔出来,为什么要打破它呢

  • 解压缩
    .xlsx
    .xlsm
    文件
  • 编辑
    xl/worksheets/sheet.xml
  • 搜索并删除
    标记
  • 保存,再次压缩,享受
原始答案(截至Excel 2010)

迷人-我以前知道代码片段,但不知道brettdj发布的解释。正如其他人所解释的,这是对散列冲突的暴力搜索。实际上,它似乎是通过反复试验完成的,因为它所做的工作远远超出了必要的范围(生成了194560个组合,但可能只有32768个哈希值)

简而言之,Excel的哈希算法(如中所述):

  • 取密码中每个字符的ascii码
  • 将其视为16位有符号数字。根据字符的位置将其位向左移动(第一个字符为1位,第二个字符为2位,依此类推)
  • 将所有字符异或在一起,得到一个16位有符号整数>=0
  • XOR,结果是密码长度和一个幻数
  • 知道了这一点,我们可以设计如下的暴力搜索:

    • 最高位始终为零,因此有15位需要测试
    • 将它们分成三个计数器,每个计数器覆盖5位。这样,每个计数器都可以表示一个可打印的ascii字符
    • 将这些计数器的ascii表示形式打包为密码字符串,这样它们就不会相互影响
    最简单的方法是使用11个字符的密码,并将计数器置于位置1、6和11。步骤2中的位移位以正确的方式对齐计数器位:第一个计数器(“x”)移位1位,第二个计数器(“y”)移位6位,第三个计数器(“z”)移位11位。在哈希的按位表示中,计数器影响以下位:

    bit: 76543210 76543210
    cnt: -zzzzyyy yyxxxxxz
    
    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
    

    旧式office文档格式中的密码保护使用了与湿T恤相当的加密技术:“有盖,但一切仍然可见”。它从来就不是为了“安全”。如果您想要安全性,那么较新的“x”版本确实使用了更好的加密,并且更难进入。@MarcB太真实了-喜欢这个评论office文件中没有主密钥。所使用的算法非常容易破解(例如,elcomsoft的office密码恢复应用程序可能会获得旧密码)
    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