Увлекательный - раньше я знал фрагмент кода, но не объяснение, которое написал brettdj. Как объяснили другие, это поиск грубой силы для хеш-коллизий. Фактически, похоже, это было сделано методом проб и ошибок, поскольку оно делает гораздо больше работы, чем необходимо (сгенерировано 194560 комбинаций, но есть только 32768 хэш-значений).
Хэш-алгоритм Excel короче (как объяснено в http://chicago.sourceforge.net/devel/docs/excel/encrypt.html ):
Зная это, можно выполнить поиск грубой силы следующим образом:
Самый простой способ - использовать 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