機械学習はSHA256ハッシュをデコードできますか?


43

64文字のSHA256ハッシュがあります。

ハッシュの生成に使用される平文が1で始まるかどうかを予測できるモデルをトレーニングしたいと考えています。

これが「可能」かどうかに関係なく、どのアルゴリズムが最良のアプローチでしょうか?

私の最初の考え:

  • 1で始まるハッシュの大きなサンプルと1で始まらないハッシュの大きなサンプルを生成します
  • ハッシュの64文字のそれぞれを、ある種の教師なしロジスティック回帰モデルのパラメーターとして設定します。
  • モデルが正しいか間違っているかを伝えることでモデルを訓練します。
  • プレーンテキストが1で始まるかどうかを十分に高い精度で(および適切なカッパで)予測できるモデルを作成できることを願っています

22
参考までに、これはビットコインマイニングによるものと思われます。
ClojureMostly

55
「これが「可能」であるかどうかに関係なく、時間旅行を可能にするモデルをどのように訓練しますか?」
コンラッドルドルフ

13
@Joshua OPはSHA-256 を反転させたいと考えています。SHA-256の1000倍の手順を踏んでも、彼に公開させます。ソリューションはほぼ確実に現実の構造内のバグを悪用してロジックを無効にするため、私も存在しなくなります。
コンラッドルドルフ

15
すべてのSHA256ハッシュは、「1」で始まる文字列によって生成できます。
-Reactgular

8
@cgTag申し訳ありませんが、それは間違っています。入力は出力を制御します。そうでなければ、そもそも関数ではありません。また、無限のリストがあるからといって、それらの1つが1で始まることを意味するわけではありません。SEコメントで既知の暗号推測を証明しようとしています。注:私もそれが真実だと信じていますが、それが真実であると主張することは誤解を招きます。あなたが正しいなら、確かに論文や他の参考文献があるでしょう。
ペドロA

回答:


98

これは実際には統計の答えではありませんが、次のとおりです。

いいえ、与えられたハッシュには「プレーンテキスト」のようなものがないため、ハッシュからプレーンテキストの最初の文字を決定することはできません

SHA-256はハッシュアルゴリズムです。プレーンテキストが何であれ、多くの場合64文字の16進文字列として表される32バイトの署名を取得します。可能な64文字の16進文字列よりもはるかに多くの可能性のある平文があります。同じハッシュは、任意の数の異なる平文から生成できます。「1」であること/ないことの最初の文字が、特定のハッシュを生成するすべての平文にわたって均一であると信じる理由はありません。


21
これはこれまでのところ(私の意見では)唯一の正しい答えです。他のすべての答えは、ハッシュ(実際の質問)を反転させることを学ぶよりも、ハッシュ関数を学ぶという問題に対処しているようです。それらはすべて、そのハッシュが単射関数ではないことを無視しているようです。
ルカシティ

7
最初の文字が1つである確率を予測できませんか?1対1の欠如は、統計学習において珍しい問題ではありません。
マシュードゥルーリー

16
@MatthewDrury SHA256が与えられたハッシュのためにも同様に可能性の高いすべての入力を行うように設計されていることを考えると、うまくいけば、1から始まる無限に多くの入力があるだろう、任意のハッシュのために。したがって、確率を推定する場合、最良の推定値はおおよそます。1256±ε
コンラッドルドルフ

12
はい、同意します。単射性の欠如は、機械学習の適用に関する構造的な問題ではないことに注意したいだけです。
マシュードゥルーリー

6
@IMilハッシュ関数であるという事実を具体的に述べた理由は、ハッシュ関数がその情報を明らかにする可能性があることを示唆するためではなく、「平文」のようなものはないというステートメントを動機付けるためです。確かに、(悪い)ハッシュ関数は部分的に可逆であり、それを生成する平文のセット全体について明確に何かを伝えることができますが、SHA-256のそれを信じる理由はありません。
クリスH

51

SHA256は可能な限りランダムになるように設計されているため、1プレフィックスのプレーンテキストからのハッシュとそうでないハッシュを分離することはできません。その情報を提供するハッシュ文字列の機能が存在しないようにする必要があります。


5
「ありそうもない」と「すべき」-アルゴリズムが教えてくれること。一見すると不可能に見えますが、この仮説を検証するためにどのアルゴリズムとアプローチを採用するかを知りたいと思います。
ジョン

24
+1あらゆる種類の「教師なしロジスティック回帰モデル」は、天文学的な数のケースを提供できない限り、推測よりも優れたものになることが保証されています。この問題は風車で傾いています。
whuber

44
あなたはそれを試すことができますが、学習者は意図的に存在しないように設計された統計的関係を見つけようとします。
パベル・コマロフ

32
「可能な限りランダムになるように設計」は控えめな表現です。具体的には、各入力ビットが出力ビットの約50%に影響を与え、各出力ビットが入力ビットの約50%に依存する、最大限の非線形依存性を設計することを目的としています。これは混乱と拡散として知られています。ここでのタスク(最初のビットだけを回復する)は、メッセージ全体を回復するのと同じくらい難しくなります。
–MSalters

12
この答えで「ありそうもない」強化できると思います。OPには、統計ベースの手法を適用してコンテンツからSHA256ハッシュの任意の部分を予測したり、その逆を行ったりする可能性はありません。ランダムな推測よりも改善が見られます。実用的な解決策は、基本的に元のコンテンツの対象集団全体を事前に計算することです。
ニールスレーター

43

これが「可能」かどうかに関係なく、どのアルゴリズムが最良のアプローチでしょうか?

申し訳ありませんが、それは無意味な質問です。何かが不可能な場合、問題への最善のアプローチを探すことはできません。

この場合、ハッシュは一方向の関数であるため、これは間違いなく不可能です。複数の入力(実際には無限)は同じ出力を生成できます。入力の最初のビット自体が特定のハッシュ値の確率に何らかの影響を与える場合、これはハッシュアルゴリズムに完全な欠陥があることを意味します。

ニューラルネットワーク、線形分類器、SVMなどを予測してトレーニングすることができます。また、特定のハッシュアルゴリズムの出力から入力を確実に予測できる場合、これはこのアルゴリズムが価値がないことを証明します。SHA256のような広く使用されているアルゴリズムでは、このような可能性は非常に低いと思います。ただし、新しい、実証されていない、テストされていないハッシュアルゴリズムをすぐに除外するのは合理的なアプローチです。


6
ハッシュが一方向性関数であることは(ほとんど)無関係です:私の頭上からは、元の入力((有名な非線形一方向関数)は、入力について多くのことを教えてくれます)。sign(x)
コンラッドルドルフ

11
@KonradRudolph:「一方向関数」には、このコンテキストでは特定の意味がありますが、それはあなたが考えている意味ではありません。sign(x)プレイメージを見つけるのは簡単なので、この意味では一方向関数ではありません。
user2357112

4
そうは言っても、答えは「一方向関数」を正しく使用しているとは思いません。
user2357112

1
@ user2357112ありがとう、私はそれを知りませんでした。単射ではあるが全単射ではない関数としての意味しか知りませんでした。それは答えで与えられた定義でもあり、それは私が反対したことです。
コンラッドルドルフ

1
ええ、申し訳ありませんが、私は定義が少し緩いです。しかし、より厳密な用語よりも「一方向」の方が初心者には理解しやすいと思います。
IMil

26

例では否定を証明することはできませんが。それでも、例は示唆に富むものだと感じています。おそらく便利です。また、同様の問題をどのように解決しようとするかを示しています。

バイナリベクトルである機能を使用して、バイナリ予測を作成する場合 、ランダムフォレストは確実な選択です。この種の質問は、あなたの質問の2番目の部分、つまり優れたアルゴリズムとは何かに答えると思います。

各ビットは統計的に独立しているため、SHA256文字列をバイナリ(ブール)ベクトルに前処理したいので、各ビットは優れた機能です。したがって、入力は256要素のブールベクトルになります。

デモ

Julia DecisionTree.jlライブラリを使用して全体を実行する方法のデモを次に示します。

以下をjuliaプロンプトにコピーして貼り付けることができます。

using SHA
using DecisionTree
using Statistics: mean
using Random: randstring

const maxlen=10_000 # longest string (document) to be hashed.

gen_plaintext(x) = gen_plaintext(Val{x}())
gen_plaintext(::Val{true}) = "1" * randstring(rand(0:maxlen-1))
gen_plaintext(::Val{false}) = randstring(rand(1:maxlen))


bitvector(x) = BitVector(digits(x, base=2, pad=8sizeof(x)))
bitvector(x::AbstractVector) = reduce(vcat, bitvector.(x))

function gen_observation(class)
    plaintext = gen_plaintext(class)
    obs = bitvector(sha256(plaintext))
    obs
end

function feature_mat(obs)
    convert(Array, reduce(hcat, obs)')
end

########################################

const train_labels = rand(Bool, 100_000)
const train_obs = gen_observation.(train_labels)
const train_feature_mat = feature_mat(train_obs)

const test_labels = rand(Bool, 100_000)
const test_obs = gen_observation.(test_labels)
const test_feature_mat = feature_mat(test_obs)


# Train the model
const model = build_forest(train_labels, train_feature_mat)
@show model


#Training Set accuracy:
@show mean(apply_forest(model, train_feature_mat) .== train_labels)

#Test Set accuracy:
@show mean(apply_forest(model, test_feature_mat) .== test_labels)

結果

私がこれをしたとき、10,000までの長さの100,000のランダムASCII文字列でトレーニングしました。私が見た結果は次のとおりです。

モデルを訓練する

julia> const model = build_forest(train_labels, train_feature_mat)
Ensemble of Decision Trees
Trees:      10
Avg Leaves: 16124.7
Avg Depth:  17.9

トレーニングセットの精度:

julia> mean(apply_forest(model, train_feature_mat) .== train_labels)
0.95162

テストセットの精度:

julia> mean(apply_forest(model, test_feature_mat) .== test_labels)
0.5016

討論

基本的には何もありません。トレーニングセットの95%から、テストセットの50%をわずかに超えました。帰無
仮説を棄却できるかどうかを確認するために、誰かが適切な仮説検定を適用できますが、できないことは確かです。これは、推測率に対するわずかな改善です。

それは学ぶことができないことを示唆しています。ランダムフォレストの場合、適切な当てはめから推測だけでヒットすることができます。ランダムフォレストは、困難な入力を学習することができます。学ぶべきことがあれば、少なくとも数パーセントは期待しています。

コードを変更することで、さまざまなハッシュ関数を試すことができます。興味深いことに、組み込みhash関数でジュリアを使用した場合、基本的に同じ結果が得られました(これは暗号的に安全なhsahではありませんが、それでも良いハッシュなので、実際に同様の文字列をばらばらに送信する必要があります)。私も基本的に同じ結果を得ました CRC32c


15

ハッシュ関数は(設計上)機械学習を行うのに非常に適していません。

MLは本質的に、局所的に連続した関数をモデル化/推定するための一連のメソッドです。つまり、特定の不連続性があるかもしれないが、ある意味ではパラメーター空間のほとんどで十分に滑らかであるため、テストデータの分散サンプルのみを使用して他の結果を予測できる物理システムを記述しようとしています入力。そのためには、AIアルゴリズムは何らかの方法でデータを巧妙な基底表現に分解する必要があります。トレーニングでは、そのような形状(このような畳み込みの結果と相関するように見える)がある場合、出力が対応する領域などの構造にある可能性が高くなります(これも畳み込みなどで記述できます)。

(多くのMLアプローチは畳み込みとはまったく異なりますが、一般的な考え方は常に同じです:入力空間が非常に高いため、徹底的にサンプリングすることはできないため、外挿を可能にする巧妙な分解を見つけます比較的まばらなサンプルからの結果。)

暗号ハッシュ関数の背後にある考え方は、しかし、ということである任意の平文に変更が生じるはずである完全に異なるダイジェスト。したがって、関数をどのように分解しても、局所推定器では、その部分の小さな変動が結果にどの程度影響するかを推定することはできません。もちろん、限られたセットのすべての情報を実際に処理しない限り、これは機械学習とは呼ばれません。単に虹のテーブルを構築するだけです。


4
これを読んで、a)レインボーテーブルを構築するには、使用するハッシュ関数を知る必要があり、b)機械学習アルゴリズムが使用中のアルゴリズムを識別できる可能があります。入力と出力のサンプル(少なくともアルゴリズムに識別可能な欠陥がある場合)。そのため、元の問題が、特定する必要がある未知のハッシュ関数に関するものであると書き直された場合、より実用的に興味深いかもしれません。
送信者

7

これは「機械学習」と見なされるものに関する問題を提起するため、興味深い質問です。解決できるのであれば、この問題を最終的に解決するアルゴリズムが確かにあります。こんなふうになります:

  1. お気に入りのプログラミング言語を選択し、すべての文字列を(潜在的に非常に大きな)整数にマッピングするエンコーディングを決定します。

  2. 乱数を選択して、文字列に変換します。お使いの言語で有効なプログラムかどうかを確認してください。そうでない場合は、別の番号を選択して再試行してください。起動している場合は、起動してすぐに一時停止し、一時停止中のプログラムのリストに追加します。

  3. 一時停止したすべてのプログラムを少しの間実行します。それらのいずれかが適切なソリューションを作成せずに停止した場合は、リストから削除します。適切なソリューションが作成されたら、完了です!それ以外の場合は、すべてを少し実行した後、2に戻ります。

無限のストレージと無限の時間がある場合、上記のアルゴリズムが最終的に良い解決策を見つけることは間違いありません。しかし、それはおそらく「機械学習」の意味ではありません。

ここに問題があります:考えられるすべての問題を考慮すると、機械学習アルゴリズムは平均してこれ以上良くなりません!これは、無料昼食定理として知られてます。特定の機械学習アルゴリズムで発生する可能性のあるすべての問題の中で、迅速に解決できる数は非常に少ないことが証明されています。

アルゴリズムが予測できるパターンによって管理されているため、これらの問題を迅速に解決できます。たとえば、多くの成功したアルゴリズムは次のことを前提としています。

  1. 解は、一連の複雑な行列乗算と非線形歪みによって定義され、一連のパラメーターによって管理されます。

  2. 優れたソリューションはパラメーター空間にクラスター化されるため、必要なのは、検索近傍を選択し、そこで最適なソリューションを見つけ、検索近傍をシフトして、最適なソリューションが中央に来るようにし、繰り返します。

明らかに、これらの仮定はどちらも一般的に成り立ちません。2番目は特に疑わしい。そして、無料の昼食は、これらの仮定がほとんどの時間に当てはまらないことを教えてくれます。実際、彼らはほとんど保持しません!彼らが実際に重要な特定の問題を抱えているのは幸運だけです。

選択した問題は、最初から前提2に違反するように設計されています。ハッシュ関数は、類似の入力が完全に異なる出力を提供するように特別に設計されています。

それで、あなたの質問-この問題を解決するための最良の機械学習アルゴリズムは何ですか?-おそらく非常に簡単な答えがあります:ランダム検索。


量子コンピューティングが昼食なしの定理にどのように影響するのだろうか。おそらく、量子コンピューティングもそれに制約されています。
マックスヴァーノン

1
@MaxVernonああ、面白い。他の量子アルゴリズムと比較したとき、すべての量子アルゴリズムが同じ特性を持っていると思います。すべての量子最適化アルゴリズムが、古典的なアルゴリズムよりも平均的なケースで高速化されているかどうかはわかりません。彼らかもしれない!私が持っている疑問や自己の答え「フリーランチ」定理についての交渉は、関連する可能性があることを。(tldr;量子場合と変更された場合、あなたが行われた作業の一部を無視した場合のみ無料です...しかし、私の不思議昼食。)
senderle

5

それはほとんど不可能です。しかし、人々はSHA256でいくつかのパターンを観察しました。これは、Bitcoinを使用したSHA256の非ランダム性の区別を示唆する可能性があります(途中でより速くマイニングします)。彼らのtldr:

「理想的なランダム置換ハッシュとSHA256を区別するには、ビットコインで行われるように、大量(〜2 ^ 80)の候補1024ビットブロックを2回ハッシュします。候補ブロックのビットがまばらに設定されていることを確認します( 512(期待される平均)、ビットコインプロトコルによれば、ビットコインの「難易度」標準を満たさない候補ブロックを破棄します(結果のハッシュは多数の0で始まります)。有効な入力候補の残りのセット(467369この分析が行われました)、入力ブロックで32ビットの特定のセットを観察します(Bitcoinにnonce、入力ビット607-639がある場所にあります)。nonceフィールドに設定されたビットの平均数は左に歪んでいることに注意してください。つまり、16ビットセットの予想値よりも少ない(推定平均15.428)。

lobste.rsに関する議論を参照してください。考えられる説明の1つは、鉱夫によって導入されたバイアスです。


2
これは面白い。しかし、lobste.rsの返信はおそらく正しいです。それは大きなバイアスであり、簡単に発見できます。この長い間気付かれていなかったという考えはかなり遠いものです。
送信者

1
@senderleバイアス(存在する場合)を活用するには、最先端のハードウェアで実装/測定したときにオーバーヘッドが発生するように、計算的に安価なアルゴリズム(本質的にML /最適化アルゴリズム)を考え出す必要があります。提供される高速化によって補償されます。私の非常に大まかな推測は、ブルートフォースとその最適化された実装に勝つために、#hashtrialsの観点からの係数は10倍以上でなければならないということです。特に暗号化プロトコルとセキュリティプロトコルに賭けている人々にとって、その影響は非常に深刻です。
-IndieSolver

4

プログラムで答えます。計算要件を減らすために、sha256のバリアントを使用します。sha256はsha256の最初の16ビットにすぎません。

#!/usr/bin/python3

import hashlib
from itertools import count

def sha16(plaintext):
    h = hashlib.sha256()
    h.update(plaintext)
    return h.hexdigest()[:4]

def has_plaintext_start_with_1(digest):
    """Return True if and only if the given digest can be generated from a
    plaintext starting with "1" first bit."""
    return True

def plaintext_starting_with_1(digest):
    """Return a plaintext starting with '1' matching the given digest."""
    for c in count():
        plaintext = (b'\x80' + str(c).encode('ascii'))
        d = sha16(plaintext)
        if d == digest:
            return plaintext

for digest in range(0x10000):
    digest = "%04x" % (digest,)
    plain = plaintext_starting_with_1(digest)
    print("%s hashes to %s" % (plain, digest))

これにより、出力が生成されます。

b'\x8094207' hashes to 0000
b'\x8047770' hashes to 0001
b'\x8078597' hashes to 0002
b'\x8025129' hashes to 0003
b'\x8055307' hashes to 0004
b'\x80120019' hashes to 0005
b'\x8062700' hashes to 0006
b'\x8036411' hashes to 0007
b'\x80135953' hashes to 0008
b'\x8044091' hashes to 0009
b'\x808968' hashes to 000a
b'\x8039318' hashes to 000b
[...]

読者への演習として完全な証拠を残しますが、私の言葉を受け入れてください:0000からffffまでの可能なダイジェストごとに「1」で始まる入力があります。

「1」で始まらない入力もあります。そして、シェークスピアの完全な作品から始まるものもあります。

私のブルートフォース証明は計算上実行不可能になる可能性がありますが、これは合理的に優れたハッシュ関数に当てはまります。


数学では、あなたの言葉を好むのは好きではありません。プログラムは、sha16関数が全射であることを示していますが、それ以上ではありません。このプログラムが実際のSHA-256機能を証明できるという正式な証拠を提出しませんでした。結論のスタイルにより、Collat​​z予想は、32ビットで既に解決されており、プログラムを簡単に長く実行できるため、解決されます。
ローランドイリグ

4

あなたが説明するのは、基本的にプレイメージ攻撃です。ハッシュされたときに、出力に「a leading 1」などのプロパティがあるような入力を見つけようとしています。*

このようなプリイメージ攻撃を防ぐことは、暗号化ハッシュの明確な目標です。そのような攻撃を行うことができる場合、そのアルゴリズムは安全ではないと見なし、使用を停止する傾向があります。

それは不可能ではないことを意味しますが、それはあなたの機械学習アルゴリズムが世界の数学者とそのスーパーコンピューターの大部分を同時に追い越さなければならないことを意味します。そうすることはまずありません。

ただし、そうすると、主要な暗号化ハッシュアルゴリズムを破った人物として知られるようになります。その名声は何か価値があります!

*技術的には、「最初のプリイメージ攻撃」は、特定のハッシュに一致するものを見つけようとします。ただし、ハッシュアルゴリズムに最初のプリイメージ攻撃耐性があることを示すために、通常、ハッシュからの入力に関する意味のある情報を見つけることができないことを示しています。


2

ここでのほとんどの答えは、なぜこれができないのかを示していますが、ここに直接答えがあります:

これが「可能」かどうかに関係なく、どのアルゴリズムが最良のアプローチでしょうか?

入力が十分に大きいと仮定します。

  1. 有効な文字セットのカウントを取得します。
  2. 手順1の数値の逆数を取ります。

これは、入力文字列が「1」で始まる確率です。入力を見る必要さえありません。それ以上のことができれば、ハッシュは非常に壊れています。乱数を選択するアルゴリズムをトレーニングしようとすることで、多くのCPUサイクルを節約できます。

アルゴリズムをトレーニングできますが、オーバーフィッティングのために別の答えが出てくる可能性があります。それは、ハッシュアルゴリズムに本当に問題がある場合を除きます。このアルゴリズムの使用は、単にランダムな値を選択する場合よりも頻繁に間違っています。


1

ハッシュ関数は意図的にモデル化するのが難しいように設計されているため、(すでに指摘したように)これは非常に難しい可能性があります。それでも、ハッシュ関数の弱点はエントロピーを低下させ、予測可能性を高めます。

これが「可能」かどうかに関係なく、どのアルゴリズムが最良のアプローチでしょうか?

便利な例は、物理的に複製できない関数、またはPUFです。これは、ハードウェアハッシュ関数に類似しています。通常、製造のバリエーションは意図的に各PUFにわずかに異なる応答を与えるために使用されるため、「ハッシュされた」出力は特定の入力に対して異なります。ただし、設計の弱点によりエントロピーが制限され、十分なチャレンジ/レスポンスペアが与えられた場合、PUFのブラックボックスモデルを構築して、以前は見えなかった新しいチャレンジのレスポンスを予測できることがよくあります。

ロジスティック回帰は、Rührmairによるこの論文のように、これらのモデリング攻撃で最も一般的に使用されるアプローチです。

遺伝的アルゴリズム(またはより一般的には進化戦略)は、微分可能および/または線形分離不可能な問題に適用できるため、代替アプローチとなる可能性があります。これらについても上記のペーパーで説明しています。


1

251222562256

26402641

2256264(2256264)!

S=(2256264)
C=90100S
CSC

(1S1S11S2...1S(C1))(SC1SCSC2SC1SC3SC2...12)=(SC1)!S!

=(110(2256264)1)!(2256264)!
2(2263.99184665662260.6509677217)
210.13222373912260.6509677217

22562512


1

問題は、「機械学習」がインテリジェントではないことです。パターンを見つけようとするだけです。SHA-256には、パターンはありません。見つけるものは何もありません。機械学習には、ブルートフォースよりも優れたチャンスはありません。

コンピューターでSHA-256をクラックしたい場合、唯一の可能性は本当のインテリジェンスを作成することです、そして多くの賢い人間がSHA-256を作成する方法を見つけていないので、あなたはよりはるかに高い人工知能を作成する必要があります多くの賢い人間のそれ。その時点で、そのような超人的な知性がSHA-256をクラックするか、クラックできないことを証明するか、またはどちらかを行うのに十分ではないことを決定するかどうかはわかりません(ちょうど人間として)。4番目の可能性は、もちろん、そのような超人間の人工知能は気にせず、(それにとって)より重要な問題について考えることです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.