簡體   English   中英

Diffie-Hellman私鑰

[英]Diffie-Hellman Private Key

我有以下代碼行來生成私鑰:

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

GP是靜態數字。 Xa是隨機生成的。 我每次運行程序時,它給了我同樣的結果Ya 這對Diffie-Hellman來說是否正確? 我認為每次運行算法時都必須更改私鑰。

問題是Java中的Random類有一個帶有一個long參數(稱為種子 )的構造函數,它允許您以特定方式啟動偽隨機數序列。

如果您始終使用相同的種子,則始終會獲得相同的序列。

要解決此問題,請嘗試以下方法:

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

這樣,種子總是不同的,每次調用上面的行時序列都會改變。

其他人似乎已經對你生成的隨機數問題給出了很好的答案,所以我會回答你的問題“這對Diffie-Hellman來說是否正確?”

我認為你對Diffie-Helman的理解有點偏。 首先,你繼續使用術語“私鑰”,好像還有一個“公鑰”。 Diffie-Hellman密鑰交換是用於交換一個對稱密鑰的技術。 沒有私鑰和公鑰,只有一個密鑰,雙方將用於加密他們的消息。 而且,你說這是“生成”密鑰的代碼。 有了Diffie-Hellman,它需要兩個探戈。 此代碼不足以生成密鑰的最終產品。 您需要將Ya發送給第二方並從該第二方獲取回復以完成該過程。 有關詳細信息,請參見下文

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

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

SK = (int)Math.pow(R, Xa) % P;

因此,簡而言之,在計算Ya之后不要重新計算Xa ,否則您將無法生成密鑰。 過程如下:

  1. 生成Ya (我只是使用這個變量名,因為它是你使用的)。
  2. Ya發送給某人。
  3. 從您發送給Ya的人那里收到一些號碼(在上面的示例中稱為此號碼R )。
  4. 計算您將使用RXaP進行加密的對稱密鑰。 (參見上面的SK公式)

我認為問題可能是你的指數溢出了兩倍,導致無窮大,每次都產生相同的值(除非你很幸運,最終為你的指數返回一個非常低的數字)。

此外,請務必使用安全隨機來獲取隨機值:

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);

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

嘗試使用System.currentTimeMillis();您的生成器播種System.currentTimeMillis();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM