2011-01-03 8 views
3

はサンプルのJava自己chekingプログラム(自動チェックサム)私はここで少しjavaのセルフチェックプログラムをanalzeする必要が

public class tamper { 
     public static int checksum_self() throws Exception { 
      File file = new File ("tamper.class"); 
      FileInputStream fr = new FileInputStream (file); 
      int result;     // Compute the checksum 

      DigestInputStream sha = new DigestInputStream(fr, MessageDigest.getInstance("SHA")); 
    byte[] digest = sha.getMessageDigest(); 

    int result = 12 // why??? 
    for(int i=0;i<=digest;i++) 
    { 
    result = (result + digest[i]) % 16 /// modulus 16 to have the 16 first bytes but why ?? 
    } 

    return result; 
     } 

     public static boolean check1_for_tampering() throws Exception { 
      return checksum_self() != 10; 
     } 

     public static void main (String args[]) throws Exception { 
      if (check1_for_tampering()) { 
      System.exit (-1); 
      } 

     } 
} 

ですが、私はモッズ16を行うことがなぜ本当にunderstantいけないし、その結果を置く= 12 ?

答えて

1

mod16は、最後の16バイト、またはさらに下位4ビットを与えません。それはn/16の残りの部分を与えます。これは、簡単にネガティブになる可能性があり、ダイジェストのバイトを累積する良い方法ではありません。

2つのランダムファイルが同じ結果を生む確率は1/31です。私はこれを考えることができ

簡単な方法は、はるかに目の肥えたが

return new String(digest, 0).hashCode(); 

2つのファイルが同じハッシュコードを持つの40億チャンスの1を持っているでしょうだろうだろう、とコードがはるかに短いです。

1

多分、このサンプルコードの作者は、ダイジェスト全体の16バイトをチェックしたくないかもしれないので、ハッシュからハッシュを作ることに決めました。これがmod16の操作です。それはモジュロ16をダイジェストの最初の16バイト(より具体的には、ダイジェストの4ビットダイジェスト)でハッシュし、その結果を10と比較します。 私が間違っていれば私を修正しますが、値12実際のハッシュ値と照合された値が一致していることを確認するために、ランダムに選択されます。

Peterが言ったように、それは完全な解決策ではありません。

2

おそらく、モジュロがなければ、チェックサムを埋め込むのが非常に難しいからでしょう。あなたがプログラムを書いたと想像してみてください。一度にすべてを書き込むことはできますが、正しいチェックサムを試す必要があります。

チェックサムをモジュロ4と書いてみましょう。最初は値を0と比較します。プログラムを実行しましたが、改ざんが検出されました。どうして?ソースコード全体を書くまで、チェックサムを知らないからです。また、チェックサム値が埋め込まれているため、ソースコードが変更されるたびにチェックサムが変更されます。

だから、それは自分の尾を追う犬のようなものです。またはそれを食べているヘビは自分の尾です。技術的に言えば、これはフィードバックループを持つ動的システムの状況です。それでは、アナロジーは十分です。

動作させる唯一の方法は、実験することです。チェックサムをゼロにしてコンパイルしてください。たぶんおそらく1/4確率(4を法とするすべての値が4の値を持つことができるため)が正しく推測されるので、それが(不正確に)改ざんされたことを認識します。次に値を1に変更します。2より大きく、最後に3になると、

のいずれかが一致する可能性がありますが、モジュロ値が低いと、改ざん検出の可能性が低くなります。したがって値16は基本的に妥協です。モジュロ値をできるだけ低く保ち、推測量を適度に少なくしたいとします。一方、モジュロ値を高くすることで、アルゴリズムの改ざんを防ぎます。

関連する問題