2013-08-10 2 views
0

Я научился писать код, реализующий алгоритм обмена ключами Диффи-Хеллмана ниже, но я чувствую, что мой код не является самым эффективным. Может кто-нибудь исправить мой код, пожалуйста ...?Является ли код, который я написал для моего упражнения, эффективным?

import java.math.BigInteger; 
import java.security.SecureRandom; 
import java.security.spec.AlgorithmParameterSpec; 
import java.util.Random;; 

    public class DH_key { 
     static class DHGenParameterSpec implements AlgorithmParameterSpec{ 
      static BigInteger p; 
      static BigInteger g; 
      static int a,b; 
      static BigInteger A,B; 
     static BigInteger getPrimeP_G() { 
      Random rand1= new Random(System.currentTimeMillis()); 
      Random rand2= new Random(System.currentTimeMillis()*10); 

      p= BigInteger.probablePrime(32, rand1); 
      g= BigInteger.probablePrime(32, rand2); 
      System.out.println(""+p+","+g); 
      return null; 
     } 
     static int getExponent() { 
      SecureRandom ranGen1 = new SecureRandom(); 

      a= ranGen1.nextInt(1000); 
      b= ranGen1.nextInt(1000); 
      System.out.println(a+"__"+b); 
      return 0 ; 

     } 
     public static Object pow(){ 
      //g.pow(a); 
      A = g.pow(getExponent()).mod(getPrimeP_G()); 
      B = g.pow(b).mod(p); 

      return null;   
     } 



    public static void main(String[]args){ 
     //System.out.println(DHGenParameterSpec.getPrimeP_G()); 
     DHGenParameterSpec.getPrimeP_G(); 
     DHGenParameterSpec.getExponent(); 
     A = g.pow(a).mod(p); 
     B = g.pow(b).mod(p); 

     BigInteger Sa,Sb; 
     Sa=B.pow(a).mod(p); 
     Sb=A.pow(b).mod(p); 

      System.out.println(""+A+"__"+B); 
       System.out.println(""+Sa+"__"+Sb); 
     } 

     } 

    } 

Был ли код, соответствующий правилу java? ??

+0

спасибо всем, кто помогает мне редактировать мой вопрос :) –

ответ

1

Вы написали модульное возведение в степень, как:

 A = g.pow(getExponent()).mod(getPrimeP_G()); 
     B = g.pow(b).mod(p); 

Это неэффективно, потому что промежуточный результат из экспоненциации может быть большое количество. Вы должны использовать метод modPow вместо этого, который делает две операции с эффективным алгоритмом:

 A = g.modPow(getExponent(), getPrimeP_G()); 
     B = g.modPow(b, p); 
+0

я пытаюсь использовать modPow раньше ..., проблема getExponent должен быть BigInteger, тогда как мне нужно целочисленное значение from getExponent() –

+0

Вы можете использовать метод BigInteger.valueOf (long) 'для преобразования примитивных целочисленных типов в' BigInteger' – Joni

+0

благодаря @Joni я меняю свой код на modPow и конвертирую примитивное целое с BigInteger.valueOf (long), и он работает ..., спасибо вам большое :) –

Смежные вопросы