iOS9: попробуйте открыть приложение по схеме, если это возможно, или перенаправить в магазин приложений в противном случае

Увлекательный - раньше я знал фрагмент кода, но не объяснение, которое написал brettdj. Как объяснили другие, это поиск грубой силы для хеш-коллизий. Фактически, похоже, это было сделано методом проб и ошибок, поскольку оно делает гораздо больше работы, чем необходимо (сгенерировано 194560 комбинаций, но есть только 32768 хэш-значений).

Хэш-алгоритм Excel короче (как объяснено в http://chicago.sourceforge.net/devel/docs/excel/encrypt.html ):

  1. Возьмите код ascii каждого символа passwort.
  2. Относитесь к нему как к 16-битовому номеру. Сдвиньте его биты влево, в зависимости от положения символа (1 бит для первого символа, 2 для второго и т. Д.)
  3. XOR все символы вместе, давая 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

Операции 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

37
задан Community 23 May 2017 в 10:31
поделиться