2017-12-22 11 views
-1

これは学校の仕事です。部分的に知られているDiffie-Hellmanクラック

DH交換で両当事者の秘密鍵を見つける問題があります。テストに含まれる数字は十分ではなく、タスクは基本的にはブルートフォースです。 この作業では、素数p、発電機g、アリスの公開鍵Aを得ることができます。 私は、メッセージを暗号化し、カスタムキーでメッセージを解読する方法も与えられています。

今のところ、は、整数i=1...pをループし、g^i mod p == g^A mod pがあるかどうかを確認し、要件を満たす最初の値をただちに返すだけです。

しかし、私の解決策は自動化されたテストでは必ずしも真実ではありません。 誰でも知っている可能性がありますかフィンab与えられた情報とは?第三者へ

+0

公開鍵は 'g^A'ではなく、' A'です。 'g^a == g^A'ではなく' g^a == A'というような 'a'を見つけようとするべきです。 –

答えて

0

おかげで、私はDHコードをクラックするために管理:

public Integer crackAlice() { 
     // TODO 
     Integer alicePrivate = 0; 

     int p = session.getP(); 
     int g = session.getG(); 
     int A = session.getAlicesPublicKey(); 
     // A = g^a mod p 


     System.out.println("Alice public A: "+A); 
     String message = String.valueOf(156215); 

     for (int i = 1; i < p; i++) { 
      if (BigInteger.valueOf(g).pow(i).mod(BigInteger.valueOf(p)).equals(BigInteger.valueOf(A))) { 
       //System.out.println("\t\t\t\t"+BigInteger.valueOf(g).pow(i)); 
       alicePrivate = i; 
       System.out.println("Potential Alice private a: "+i); 
       //break; 
      } 
     } 
     return alicePrivate; 
    } 

public Integer crackBob() { 
     // TODO 

     Integer bobPrivate = 0; 
     Integer a = crackAlice(); 
     int p = session.getP(); 
     int g = session.getG(); 
     int A = session.getAlicesPublicKey(); 
     String mainMessage = "teade"; 

     String msg = null; 
     try { 
      msg = session.getEncrypted(mainMessage); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     for (int i = 1; i < p; i++) { 
      int ai = a*i; 
      int Ai = A*i; 
      //System.out.println("a*b = "+ai); 
      BigInteger bigintP = BigInteger.valueOf(p); 
      if (((BigInteger.valueOf(g).pow(a).mod(bigintP)).pow(i)).mod(bigintP) 
        .equals(((BigInteger.valueOf(g).pow(i).mod(bigintP)).pow(a)).mod(bigintP))) { 
       String decrypt = null; 
       try { 
        decrypt = session.getDecryptedWithCustomKey(msg, BigInteger.valueOf(g).pow(a*i).mod(bigintP).intValue()); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       if (decrypt != null && decrypt.trim().equals(mainMessage)) { 
        bobPrivate = i; 
        break; 
       } 
      } 
     } 
     return bobPrivate; 
    } 

私はこれが同様の問題を持つ他の助けを願っています。

関連する問題