2011-09-28 5 views
3

本質的に私の友人は、自分が作成した暗号化されたコンテナから自分自身をロックしました。パスワードを入力するときには、コンテナにアクセスできないため、入力ミスをしているに違いありません。私たちはそれが何であるかを知っており、実際のパスワードはこれのバリエーションであるか、それに非常によく似ています。私は、パスワードまたはパスワードが知られているパターンの既知の部分が与えられた場合、この「曖昧な」パスワードクラッキングの概念を扱うコードまたはホワイトペーパーを探しています。言語は重要ではありません。私はすでにパスワードプロンプトを強要する方法を開発しました。私が必要とするのは、私が知的にそれを解読しようとするアルゴリズムを開発して、すべての可能な組み合わせを試す必要はありません。私は他の誰かが既にこれをしていると思います。私はこれの背後にある概念をある程度理解していますが、すでに誰かがこの問題を解決しているかもしれないコードやホワイトペーパーを探しています。既知のアルゴリズム、オープンソースプログラム、またはパスワードの既知の部分が与えられたときにパスワードをクラックするためのホワイトペーパーはありますか?

UPDATE だから私は、パスフレーズであるかもしれない文字を使用して、辞書(パイソンが、任意の言語での例を送ること自由に感じ)を構築してきました。 Shiftキーの近くにあるので、標準的なQWERTYキーボードのキーストローク近接、1337相当のスピード、各文字の偶発的な '/'文字が考慮されました。そこからサンプルのパスフレーズが供給され、各文字が試されます。これは、この例を以下の通りです:架空の「オープン・セサミ」は暗号化されたボリュームのこの特定のタイプのマウントに変更するユーティリティです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() 

、それはPythonで書かれていませんでしたが、そのコマンドラインツールに行われていますこのスクリプトはそのスクリプトと対話できます。

挑戦/研究の方向性のカップル:

  • 「/」文字が誤ってShiftキーの代わりに見舞われた場合、これは実際にはパスフレーズに文字を追加することになりますので、任意の前に現れる可能性があり手紙これは、ソリューション内で考慮する必要があります。
  • @rrenaudによって提案されたスペルチェッカユーティリティで、これを統合するとよいでしょう:http://norvig.com/spell-correct.html
  • 私はスペルチェックの問題を解決するために適用された確率統計のベイズのTheorumのアプリケーションによって魅了よ。誤ったキーストロークや特定の単語やフレーズを入力するときに特定のキーに当たる確率についての調査があるかどうかは疑問です。このロジックは、一般的なスペルミスの既知のリストから恩恵を受けるスペルチェックユーティリティとほぼ同じ方法でパスワードクラッキングに適用できます。私はニューラルネットユーティリティを「訓練」するための誤ったキーストロークデータを持っていません。

私は大きな助けに感謝しています。私はこれまでのところどこにいても、皆の利益のために共有したいと思っていました。

+4

私の「友人」もこの回答に興味があります; – nachito

+0

秒当たりの試行回数はどれくらいの速さですか? – corsiKa

+0

これは参考になりますが、これとrrenaudのコードを組み合わせる方法が不思議です:http://code.activestate.com/recipes/535171-password-cracker/ – Dan

答えて

3

既知の不具合のあるパスワードから編集を列挙しようとしましたか?あなたが数回編集しただけでは(それがタイプミスであるように)、本当に多くの可能性はありません。

edits1()関数の訂正のためにNorvigによって編集された1レベルの編集がこのbeautiful codeによって解決されました。あなただけの道の深化深さ第一種のそれを適用することができ、あなたは、あなたの文字セットを必要とする

+0

これは非常に面白そうです、今私はあなたが提供したリンクとhttp://code.activestate.com/recipes/535171-password-cracker/をどのように組み合わせることができるのだろうかと思っています。 – Dan

+0

あなたは間違ったパスワードがいくつかの大きな相互接続されたグラフのノード。パスワードの間に似ているエッジがあります。 Norvigの呪文矯正師(私は半分ほどコードを書くのに十分だったと思います)は、各編集をコスト1として扱いますが、すべて同じです。あなたが投稿したパスワードクラッカーは、基本的に特定の置換を低コストとして扱います。 –

+0

これをコード例で更新しました。 – Dan

2
  • まずなどの編集の編集の単一最初の編集、およびその後、編集の編集、および編集をしてみてください。特殊文字は可能性がありましたか?大文字と小文字?数字?

  • 次は、元の推測が必要です。たぶん2つの推測、2番目のケースでは、CAPS LOCKキーが押された可能性のために、上下のケースを逆にします。 (ファジーv。ファジー)

  • 編集、削除、挿入のすべての可能性を反復する必要があります。

    • あなたは今、あなたはあなたがこれをしたいどのくらい決める初期推定
  • の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(推測)によって返された配列を反復することで、推測をパスワードリストに出力できます。

+0

これはいいですが、私は推測することを避けようとしています。私は私の質問を更新します。 – Dan

+0

これをコード例で更新しました。 – Dan

関連する問題