2013-07-05 45 views
0

我需要Diffie Hellman協議來創建函數XpowYmodN。我在網上找到了以下功能:Java XpowYmodN函數,DiffieHellman

public long XpowYmodN(long x, long y, long N) { 
    long result = 1; 
    final long oneShift63 = ((long) 1) << 63; 

    for (int i = 0; i < 64; y <<= 1, i++) { 
     result = result * result % N; 
     if ((y & oneShift63) != 0) 
      result = result * x % N; 
    } 
    return result; 
} 

對於這個例子:XpowYmodN(29,83,53)的結果是43,根據設備的計算製造商的結果應該是50.任何人都可以點我我在哪裏做錯了? 我試過Math.pow(X,Y)%N,對於這個例子,我得到了結果28.我進行了實驗,並想了解如何解決它的一些提示。謝謝。

+0

43是正確答案。 –

回答

0

爲什麼不使用類java.math.BigInteger?這個類有一個名爲modPow()的方法,它被設計用於密碼學使用。

的用法是

BigInteger result = BigInteger.valueOf(x).modPow(BigInteger.valueof(y), BigInteger.valueOf(n)); 

順便說變量與小寫字母命名(n在我的情況)。

0

您的回答是正確的。但計算器提供的價值不是計算而是交換的關鍵。你的答案是指發送者或接收者看到的公共價值

0

我測試了各種數字到該功能,它的工作很好。然後,我創建了使用基於烏韋Plonus的回答下面的代碼複製功能:

public long XpowYmodN(long x, long y, long N) { 
    return BigInteger.valueOf(x).modPow(BigInteger.valueOf(y), BigInteger.valueOf(N)).longValue(); 
} 

我測試你的號碼了進去,得到了43,就這樣的功能;所以這個功能似乎是完美的。發佈了29,83,53個數字,結果爲50的人看起來是錯誤的。爲29,83,53正確答案是43。

下面是完整的代碼我使用:

public class Main { 
    public static long XpowYmodN_(long x, long y, long N) { 
     long result = 1; 
     final long oneShift63 = ((long) 1) << 63; 

     for (int i = 0; i < 64; y <<= 1, i++) { 
      result = result * result % N; 
      if ((y & oneShift63) != 0) 
       result = result * x % N; 
     } 
     return result; 
    } 

    public static long XpowYmodN(long x, long y, long N) { 
     return BigInteger.valueOf(x).modPow(BigInteger.valueOf(y), BigInteger.valueOf(N)).longValue(); 
    } 

    public static void main(String[] args) 
    { 
     System.out.println("BEGIN main"); 


     System.out.println(Main.XpowYmodN_(29,83,53)); 
     System.out.println(Main.XpowYmodN(29,83,53)); 
    } 
} 

這得到輸出:

 
BEGIN main 
43 
43