2009-08-02 6 views
7

私は、次のプロパティを持つセキュア(暗号)ハッシュ関数が必要になります。(コード)はシンプル、セキュアハッシュ関数

  1. は(R5RSスキームに)できるだけ数行でコーディングすることができます。うまくいけば50未満。
  2. パスワードの長さのデータの理由の中でメモリとCPUのパフォーマンス。私は心の中でスピード/メモリ効率で設計されて見つけることができます

最も安全なハッシュ関数(例えば、それは、超効率的であるか、またはデータのバイト数百万人のためのハッシュを作成する必要はありません)、その結果、コードが複雑で。

現在の候補はマッシュ-1(またはマッシュ-2)である: Handbook of applied cryptography. Google Books

おかげ。

編集: これまでの回答はありがとうございます。次のことが失礼になる場合は私を許してください、私はただ明確にしたいです。私は宿題をして "標準"オプションを考えていることを信じてください。私が一番簡単なことは、それらを使うことですが、それは私が探しているものではありません。

私が答えようとしている1つの質問は次のとおりです。 「読み取り可能な」コードの最小量で暗号安全ハッシュアルゴリズムを実装することはできますか?

私はすでに私が見つけることができる最高の候補者を投稿しました。 Mash-1/2に関するより簡単なものや解説についての提案が最も役立ちます。

+3

率直に言って、私はよく知られているアルゴリズム以外に何も信頼しないので、学習の練習としてこれをやっていますか? –

+0

あなたが抱えている問題は、Xが少し研究された暗号プリミティブである場合、誰も彼らの心に手を差して「Xは安全です」と言う人はいないということです。これは、「安全な」とは、「重大な注意を払っても、まだ壊れていない」ことを意味するためです。 – caf

+0

セキュリティ要件を明確にする必要があります。最も一般的なハッシュアルゴリズムを選択しない場合、セキュリティトレードオフを実行しています。これは、弱点が未知である可能性が高いためです。 「セキュア」はバイナリ値ではありません。 SHA-512は実装するには複雑すぎるため、SHA-512を使用する意思はありません。簡単な実装のためにトレードオフしたいセキュリティの程度を知るのに役立ちます。 50行のSchemeで実装できる_most_安全なハッシュを探していますか?たとえそのアルゴリズムが、例えば10年以内に壊れる可能性があるとしても? –

答えて

2

あなたが効率オーバーシンプルさと教育的価値を好む場合は、VSHハッシュ関数はオプションであるかもしれません。 VSHは衝突耐性ハッシュ関数であるという強力な議論があるが、この関数は他のハッシュ関数が有するいくつかの他の特性(例えば擬似ランダム性)を欠いている。

+0

これは私が探していたようだ。私は紙にスキムを与え、あなたの答えを受け入れました。 ありがとうございます。 – z5h

1

TrueCrypt sourceをご覧ください。いくつかの強力なハッシュ関数を実装しています。標準的な警告だけですが、既存の実装を変更するのは賢明ではありません。それはほとんど確実に弱さを注入するでしょう。私はあなたがここでそれをしていないことを知っていますが、ただの免責事項です。 :)

4

SHA-512(またはおそらくRIPEMD-160)のライブラリー実装を使用して、実際に何かを保護する目的で(暗号化アルゴリズムの一部として)安全なハッシュ関数が必要な場合は、または他のいくつか)。

パスワードをハッシュ化したい場合は、MASHのようなハッシュ関数は、ブルートフォース(塩と併用した場合)とレインボーテーブルに耐性を持つ請求書に適合すると言います。私は、ライブラリーのインプリメンテーションを使用することを禁止または禁止するという厳しい要件がない限り、それを使用しませんでしたが、あなたがそうするかもしれないように思えます。

ファイルの整合性チェックのように、安全性の低いものを使用したい場合は、悪意のあるユーザーが衝突を発生させることを明示的に懸念している場合を除き、その場合、あなたが保護しているものの価値に応じて、私はMASHのような単純なものからSHA-512やRIPEMD-320のようなより耐性のあるものまで多岐に渡ります。

2

ご要望に応じて、SHA-3 finalistsをご確認ください。

暗号化用にAESプリミティブが実装されている場合は、それを再利用していくつかの機能を比較的簡単に実装できます。

そうでなければ、Daniel BernsteinのCubehashと一緒に行くと思います。それはあなたが探していた "シンプルなエレガンス"のいくつかを持っているように見えます。

+0

ありがとうございます。これは興味深い可能性のように見えます。 – z5h

2

第18項に従って。Bruce Schneierの "Applied Cryptography"の12: "一方向ハッシュ関数としてブロック連鎖モードで公開鍵暗号化アルゴリズムを使用することは可能です。"

RSA(秘密鍵は破棄されています)が例としてリストされています。セキュリティはRSAほど強力です。

RSA暗号化の手順は、実装がかなり簡単です。特に、任意の大きさの整数を持つ言語。

2つの警告: 1.ほとんどの(すべての)他の安全なハッシュ関数よりもはるかに低速です。それは私のためにうまくいく。 2.公開鍵をコードにハードコードした場合、世界は自分の秘密鍵データを破棄したと信じなければなりません。または、独自の公開秘密鍵を作成します。

私は実際の例があるとすぐにコードを投稿します。

編集:ここにあります。 30行。シンプル。安全です。 EDIT 2:私が実際に含まれているのは異形であり、動作しない可能性があります。この記事の下のコメントを見て、更新を見てください。

; compute a^d mod n 
(define powmod 
    (lambda (a d n) 
    (cond 
     ((= 0 d) 1) 
     ((= 1 d) (modulo a n)) 
     ((= 0 (modulo d 2)) (modulo (expt (powmod a (/ d 2) n) 2) n)) 
     (else 
     (modulo (* (powmod a 1 n) (powmod a (- d 1) n)) n))))) 

(define foldr 
    (lambda (func end lst) 
    (if (null? lst) 
     end 
     (func (car lst) (foldr func end (cdr lst)))))) 

; something to turn a string into a number 
(define any-string->number 
    (lambda (s) 
    (foldr 
     (lambda (a b) (+ a (* 256 b))) 
     0 
     (map char->integer (string->list s))))) 

; some big primes 
(define p 325981479175658910158495167696993467513669112200235950741366213684181287869366665231) 
(define q 930416184994449450269535709442344346507738432154879695027334802205487824589832585453) 

; hash turns a string into a number 
; see discrete logarithms. the inverse of this is *hard* to compute 
; http://en.wikipedia.org/wiki/Discrete_logarithm 
(define hash 
    (lambda (s) 
    (powmod (any-string->number s) p q))) 
+2

私は実際にそれを示唆すると考えましたが、それに対して決定しました。もう1つの欠点は、出力がかなり大きいことです。1024ビットモジュラスを使用する場合は128バイトです。また、入力をブロックに分割し、結果を連鎖する必要があることを覚えておいてください(または、入力がモジュラスより大きい場合は失敗する)。 –

+6

また、あなたが実装したのはRSAでもDiffie-Hellmanでもありません。実際には、これはかなり簡単に破ることができます。与えられた(a^p mod q)、pとqを見つけるのは簡単です。離散対数問題は、与えられた(p^a mod q)、pとqを見つけることです。 –

+1

Rasmusありがとうございます。あなたはこのスレッドで役に立ちました。 RSAの使用方法を説明する「適用された暗号化」の同じセクションでは、この方法について言及しています。私は現時点で私と一緒に本を持っていませんが、私はそれをかなり確信しています。私が家に帰ると、私は二重チェックします。 これは、どうしてこれが離散対数問題ではないのか分かります。しかし、RSAではまだいくつかの素数p qに対してnは(p-1)(q-1)であり、eはnに対して比較的素数であるメッセージ^ e mod nを有する。これは簡単に壊れやすいので、RSAもそうであるように見えるでしょう。 これを破るアルゴリズムの方向を教えてください。 – z5h

関連する問題