2011-10-12 11 views
8

JavaでSHA-1アルゴリズムで暗号化された文字列を復号化することはできますか?sha1で暗号化された文字列をJavaで復号化する方法

+2

SHA-1は暗号化アルゴリズムではなくハッシュです。あなたがSHA-1ハッシュから文字列を抽出しようとしているなら、幸運を祈る。それは、プレイメージ攻撃と呼ばれています。 – Mysticial

+1

sha1で暗号化されたデータは、暗号化された後は復号化されないため、計算資源と時間がかかる可能性があります。 – jsvk

+0

私は、sha1を解読するのは計算上の労力を要する問題であると思います。 Javaとの関係は何ですか?良いアルゴリズムをお持ちの場合は、任意の言語を使用してコード化することができます。 –

答えて

12

SHA1はcryptographic hash functionであり、元に戻すことはできません。ハッシュを逆転させることができた場合(与えられたハッシュの入力を見つける)、それは役に立たないでしょう。何かを暗号化して解読する必要がある場合は、encryption functionAESまたはRSAなど)を使用する必要があります。

しかし、非常に単純な入力の場合は、入力が何であるかを推測し、ハッシュが同じかどうかを確認することで可能です。crack the hash function

例Pythonのコードは:あなたが実際にJohn the RipperまたはHashcatのようなソフトウェアを使用して、効率的にハッシュをクラックしたい場合はもちろん

def crack_hash(hash_to_crack, hash_function, list_of_guesses): 
    # Try to hash everything in our guess list 
    for guess in list_of_guesses: 
     new_hash = hash_function(guess) 
     # if the hashes match, we found it 
     if new_hash == hash_to_crack: 
      return guess 
    # If none of them match, give up 
    return None 

、おそらくあなたの最善の策です。これはパスワードが短くて簡単に推測できるため、通常は機能しますが、入力が増えるにつれて指数関数的に増加することに注意してください。 SHA-1のすべてのハッシュを6文字の入力で分けることができますが、16文字のクラッキングは平均して数兆年を要します。

+0

この方法では、わかりやすい量のスペースと時間と、合理的なサイズのリストが必要です。もっと実用的な方法は、時間メモリのトレードオフを適用するために[rainbow table](http://en.wikipedia.org/wiki/Rainbow_table)を利用することです。 – jsvk

+0

@jsvk - これは良いアイデアだと言っているわけではありませんが、このメソッドは塩漬けのハッシュには役に立たないです。実際、私は、あなたが推測するべきことが良いアイデアを持っていないかぎり、例が無意味であることを説明することを望んでいました。それは改善することができますが、現実的には誰も独自のパスワードクラッカーを使用しません - 確かにPythonで書かれたものはありません; –

2

SHA-1はハッシュなので、これはできません。一方的なチケットです。文字列を暗号化して解読するには、暗号化されたデータを生成するためにkeyを使用する暗号化アルゴリズムを使用する必要があります。その後、データを暗号化し、復号化を成功させることができます。例えばAES。あなたはAESについて読むことができますhere

2

短い答え:それは不可能です。

SHA-1はcryptographic hash functionであるため、ピジョンホールの原理によって、逆転することは数学的に不可能です。可能なSHA-1ハッシュは2つしかありません。です。可能な入力ストリングの数は無限であるため、衝突(同じ値にハッシュする複数の入力)が必要です。一般に、それらの文字列のどれが元の入力であったかを知る方法はありません。

しかし、実際の文字列は完全に任意ではありません。入力文字列に関する情報が分かっている場合(例:5文字未満)、高い確率で入力が一意です。残念ながら、SHA-1のようなハッシュ関数は意図的に計算上逆転できません。 SHA-1には理論的な攻撃がありますが、現時点では実現可能とは考えられていません。

したがって、ハッシュデータを回復する必要がある場合は、長さがn未満の文字列で、ハッシュが一致するかどうかを確認します。しかし、長さがnまで指数関数的に多くの文字列があるので、これはすぐに実行不可能になります。

ユニバースが終了する前にハッシュデータを復元する方法は1つあります()。唯一の希望は、rainbow tablesのようなより洗練された方法を使用することです。元の文字列が非常に短い(15文字未満)ことがわかっている場合は、のみが動作します。短い文字列であっても、テーブルの事前計算には長い時間(およびギガバイトのディスク容量)が必要です。

+0

更新してください:それは非常に可能です、私はアルゴリズムが必要です。 [sha1-decrypter](http://www.stringfunction.com/sha1-decrypter.html)は、オンラインデクリプタを見つけることができるページへのリンクです –

+2

@VineetVerma:それは解読者ではありません。これは逆引きです。使用するコードは本質的に 'Map lookup = new HashMap ();/*いくつかの共通入力を追加する* /; return lookup.get(sha1sum); '。探している入力がマップに追加された場合にのみ機能します。 –

関連する問題