2013-03-18 65 views
4

我有下面的代碼行生成私鑰:的Diffie-Hellman私鑰

int Xa = randomNo.nextInt(10000); 
int Ya = (int) Math.pow(G, Xa) % P; 

GP是靜態的數字。而Xa是隨機產生的。每次運行該程序時,它都會給我提供Ya的相同結果。這對Diffie-Hellman是否正確?我認爲每次運行算法時都必須更改私鑰。

+0

您可以發佈初始化用於創建Xa的隨機對象的行嗎? – 2013-03-18 18:05:03

+0

編輯原創@VitoShadow - 我輸出了隨機數,它的工作原理。 – 2013-03-18 18:07:59

+0

你有沒有試過我的答案? – 2013-03-18 18:13:59

回答

2

我認爲這個問題可能是你四溢雙您的冪,造成無窮,每次產生相同的值(除非你足夠幸運地結束了播種的發電機爲您的指數返回一個非常低的數字)。

此外,一定要使用安全的隨機,讓您的隨機值:

Random random = new SecureRandom(); 

// If you use more than 100 here, then 
// with your value of 486 for G you will 
// end up with infinity when doing Math.pow(G,Xa). 
// Of course, this does not provide enough possible 
// values to be cryptographically secure. 
int Xa = random.nextInt(100); 
int Ya = (int) (Math.pow(G, Xa) % P); 

編輯:代碼調試(以下爲我的作品):

double G = 42; 
int P = 26; 


Random random = new SecureRandom(); 
int Xa = random.nextInt(100); 
double val = Math.pow(G, Xa); 
System.out.println("Xa: " + Xa); 
System.out.println("(double) Math.pow: " + val + " (int): " + (int) val); 
int Ya = (int) (val % P); 
System.out.println("Ya: " + Ya); 
+0

我有完全相同的代碼,只有P是26,G是42.仍然生成相同的數字? (random.nextInt是100)。 – 2013-03-18 18:42:58

+0

這是由於代碼的第二個問題(上面剛剛修復),您需要在投射前執行模塊。添加上面的括號以使其工作。 – 2013-03-18 18:48:08

+0

試過 - 仍然沒有運氣。我很難過。 – 2013-03-18 18:49:37

3

的問題是Random類在Java中有一個long參數(稱爲種子),可讓您以特定方式啓動僞隨機數序列的構造。

如果您總是使用相同的種子,您將始終獲得相同的序列。

爲了解決這個問題,試試這個:

Random randomNo = new Random(System.nanoTime()); 
int Xa = randomNo.nextInt(10000); 

這樣,種子始終是不同的,序列改變你撥打上面的行每次。

+0

所以,如果我理解正確 - 種子現在是否來自內部時鐘? – 2013-03-18 18:13:19

+0

我也收到錯誤「找不到適合nextInt(long)的方法。 – 2013-03-18 18:15:09

+0

是的,這是一個典型的技巧,用於從僞隨機數中創建隨機數 – 2013-03-18 18:15:11

1

如果Xa不同,這隻能給出不同的結果。你是如何產生Xa的價值的?你有可能使用了一個通常需要種子的僞隨機生成器。如果每次採用默認種子(每次都是相同的種子),它將始終返回相同的隨機數序列。

嘗試System.currentTimeMillis();

3

其他人似乎有在你們這一代隨機數的問題上給出了很好的答案,所以我會回答你的問題:「這對Diffie-Hellman是否正確?」

我認爲你對迪菲赫爾曼的理解有點偏離。首先,您繼續使用「私鑰」這個術語,就好像還有一個「公鑰」一樣。 Diffie-Hellman密鑰交換是用於交換一個對稱密鑰的技術。沒有私鑰和公鑰,只有雙方將用來加密其消息的密鑰。此外,你說這是「生成」密鑰的代碼。有了Diffie-Hellman,它需要兩個探戈。此代碼不足以生成密鑰的最終產品。您需要將Ya發送給第二方,並從該第二方獲取一些信息以完成此過程。請參閱下面的更多信息。

您的公式爲Ya是正確的,假設Xa是它應該是。我有點擔心你對Xa應該做什麼的理解,因爲你在生成Ya之後將其重新分配給一個隨機值。您將需要掛在Xa以創建密鑰的最終版本。

生成Ya後,您應該將其發送給對方。對方會給你回一些號碼(我們稱之爲R)。爲了讓您創建對稱密鑰(我們稱之爲SK)的最終版本,你需要計算它作爲

SK = (int)Math.pow(R, Xa) % P; 
簡而言之

所以,不重新計算Xa您計算出Ya後,否則你將無法生成密鑰。過程如下:

  1. 生成Ya(我只是使用這個變量名稱,因爲它是你使用的)。
  2. 發送Ya給某個人。
  3. 從你發送Ya的人那裏收到一些號碼(在上面的例子中稱爲這個號碼R)。
  4. 計算使用R,XaP進行加密時應使用的對稱密鑰。 (請參閱上面的公式SK
+0

乾杯@ 2to1mux - 這就更清楚了。我一直在關注網絡上的教程。 (http://www.codeproject.com/Articles/70330/Implementation-of-Diffie-Hellman-Algorithm-of-Key) – 2013-03-18 18:26:57

+0

+1。很好的解釋 – Leigh 2013-03-19 16:52:28