Существуют ли какие-либо известные алгоритмы, программы с открытым исходным кодом или технические документы для взлома пароля с учетом известной части пароля? - PullRequest
3 голосов
/ 29 сентября 2011

По сути, мой друг заперся в зашифрованном контейнере, который он создал. Должно быть, он сделал опечатку при вводе своего пароля, потому что он не может получить доступ к контейнеру. Мы знаем, каким он должен быть, и реальный пароль наверняка будет его вариантом и / или очень похож на него. Я ищу код или технический документ, касающийся этого понятия «нечеткого» взлома пароля с учетом известной части пароля или известного шаблона, которому следует пароль. Язык не важен. Я уже разработал способ подбора пароля, но мне нужно разработать алгоритм, который позволит мне разумно попытаться взломать его, чтобы мне не приходилось пробовать каждую возможную комбинацию. Я думаю, что кто-то другой уже сделал это, однако. Я до некоторой степени понимаю концепции, стоящие за этим, но ищу код или технический документ, где кто-то уже мог решить эту проблему.

UPDATE Поэтому я создал словарь (Python, но не стесняйтесь присылать примеры на любом языке), используя символы, которые могут быть в парольной фразе. При этом учитывались близость нажатия клавиш на стандартной клавиатуре QWERTY, 1337 эквивалентных слов и случайный символ «/» для каждой буквы, поскольку она находится рядом с клавишей Shift. Оттуда предоставляется образец парольной фразы и пробуется каждая буква. Это следующий пример: http://code.activestate.com/recipes/535171-password-cracker/

import os
from commands import getoutput

known = {
    '_': ('_', ' ', '-', '.', '/'),
    'b': ('b', 'B', '3', '8', '*', 'v', 'V', 'n', 'N', 'g', 'G', 'h', 'H', ' ', '/'),
    'g': ('g', 'G', '6', '^', 'f', 'F', 'h', 'H', 'b', 'B', 'v', 'V', 't', 'T', '/'),
    'l': ('l', 'L', '1', '!', ';', ':', 'k', 'K', 'o', 'O', '.', '>', ',', '<', 'p', 'P', '/'),
    'e': ('e', 'E', '3', '#', '4', '$', 'r', 'R', 'w', 'W', 'd', 'D', '/'),
    'h': ('h', 'H', '4', '$', 'g', 'G', 'j', 'J', 'y', 'Y', 'b', 'B', 'n', 'N', '/'),
    'i': ('i', 'I', '1', '|', '!', '\\', 'u', 'U', 'o', 'O', 'k', 'K', '8', '*', '9', '(', '/'),
    't': ('t', 'T', '7', '&', '+', 'r', 'R', 'y', 'Y', 'g', 'G', '4', '5', '%', '6', '^', '/'),
    'r': ('r', 'R', 'e', 'E', 't', 'T', 'f', 'F', '4', '$', '5', '%', '/'),
}

command = 'open-sesame %s' # hey, use your imagination ;)
# I obviously supplied only needed letters for this example, I can't tip you 
# off to the real pass phrase ;) This conveys the general idea....
passwdBasic = 'Big_Leg_Hitter'

def main():
    arrays = [known[ltr] for ltr in passwdBasic]
    start = [ltrs[0] for ltrs in arrays]
    end = [ltrs[-1] for ltrs in arrays]
    indexes = [0] * len(arrays)
    maxes = [len(ltrs)-1 for ltrs in arrays]
    chrs = [ltrs[i] for ltrs, i in zip(arrays, indexes)]
    while chrs != end:
        passx = ''.join(chrs)
        open('tries.txt', 'a+').write(passx + '\n')
        out = getoutput(command)
        if 'wrong password' not in out:
            print 'GOT IT!', passx
            return
        # Next letter
        for i in range(len(indexes)-1, -1, -1):
            if indexes[i] <= maxes[i]-1:
                indexes[i] += 1
                break
            else:
                indexes[i] = 0
        # Make up the chrs
        chrs = [ltrs[i] for ltrs, i in zip(arrays, indexes)]


if __name__ == '__main__':
    main()

Вымышленный «open-sesame» - это модифицированная утилита, которая монтирует этот конкретный тип зашифрованного тома, он не был написан на python, но был превращен в инструмент командной строки, чтобы этот скрипт мог взаимодействовать с ним.

Пара задач / направления исследований:

  • Если бы символ '/' был случайно нажат вместо клавиши Shift, это фактически добавило бы символ к парольной фразе и, таким образом, могло появиться перед любой из букв. Это необходимо учитывать в решении.
  • Было бы неплохо интегрировать это с утилитой проверки орфографии, предложенной @rrenaud: http://norvig.com/spell-correct.html
  • Я восхищен применением Теории вероятностной статистики Байя, которая была применена для решения проблемы проверки орфографии; Мне интересно, есть ли какое-либо исследование о ошибочных нажатиях клавиш и вероятности попадания одних клавиш над другими при наборе определенных слов и / или фраз. Эта логика может быть применена к взлому паролей почти таким же образом, как утилита проверки орфографии, которая использует известные списки распространенных орфографических ошибок. У меня нет ошибочных данных о нажатиях клавиш, с помощью которых можно «обучить» утилиту нейронной сети.

Я ценю всю огромную помощь, я просто хотел поделиться тем, где я сейчас нахожусь, для всеобщей пользы.

Ответы [ 2 ]

3 голосов
/ 29 сентября 2011

Вы пробовали перечислять правки с заданного известного ошибочного пароля?Если от вас осталось всего несколько правок (как если бы это была опечатка), возможностей не так уж и много.

Это перечисление одного уровня правок решается этим красивым кодом от Norvig для исправления орфографии в функции edits1 ().Вы могли бы просто применить это в глубине углубления первым способом, так что вы сначала пробуете отдельные правки, а затем правки правок и правки правок и т. Д.

2 голосов
/ 29 сентября 2011
  • Сначала вам нужен ваш набор символов.Были ли специальные персонажи?Верхний и нижний регистр?Числа?

  • Далее вам нужно ваше исходное предположение.Может быть, 2 догадки, во втором случае ваши верхний и нижний регистры будут инвертированы для вероятности того, что клавиша CAPS LOCK не нажата.(fuzzY v. FUZZy)

  • Теперь вам нужно перебрать все возможности ... редактирования, удаления и вставки.

    • У вас есть 3 набора начальных догадок
  • Теперь вы решаете, как далеко вы хотите это сделать.Возможно 2 редактирования, 2 удаления или 2 вставки ... или 1 редактирование и 1 вставка, или 1 удаление и 1 вставка и т. Д.

Некоторый код JavaScript для иллюстрации:

var charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
var guesses = {"passWORD":true, "PASSword":true};

function getProps(obj) {
 var lst = [];
 for(var g in obj)
  lst.push(g);
 return lst;
}
function transformEdit(guesses) {
 var lst = getProps(guesses);
 for(var x=0; x<lst.length; x++) {
  var guess = lst[x];
  for(var y=0; y<guess.length; y++) {
   for(var z=0; z<charset.length; z++) {
    guesses[guess.slice(0,y) + charset.charAt(z) + guess.slice(y+1)]=true;
   }
  }
 } 
}
function transformDelete(guesses) {
 var lst = getProps(guesses);
 for(var x=0; x<lst.length; x++) {
  var guess = lst[x];
  for(var y=0; y<guess.length; y++) {
   guesses[guess.slice(0,y) + guess.slice(y+1)]=true;
  }
 }
}
function transformInsert(guesses) {
 var lst = getProps(guesses);
 for(var x=0; x<lst.length; x++) {
  var guess = lst[x];
  for(var y=0; y<guess.length+1; y++) {
   for(var z=0; z<charset.length; z++) {
    guesses[guess.slice(0,y) + charset.charAt(z) + guess.slice(y)]=true;
   }
  }
 } 
}

// not the most efficient way
// but you'll get every possible edit, delete and insert
transformDelete(guesses);
transformInsert(guesses);
transformEdit(guesses);

getProps(guesses).length; //1759604

Код не представляет САМОЕ ЭФФЕКТИВНОЕ решение, так как существует много совпадений, которых можно было бы избежать, но это для генерации списка паролей для одной попытки, так что ...

Я использовал список свойств объекта JS в качестве набора хэшей.

Вы можете выводить догадки в список паролей, перебирая массив, возвращаемый getProps (догадки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...