[英]Diffie-Hellman Private Key
我有以下代碼行來生成私鑰:
int Xa = randomNo.nextInt(10000);
int Ya = (int) Math.pow(G, Xa) % P;
G
和P
是靜態數字。 而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
,否則您將無法生成密鑰。 過程如下:
Ya
(我只是使用這個變量名,因為它是你使用的)。 Ya
發送給某人。 Ya
的人那里收到一些號碼(在上面的示例中稱為此號碼R
)。 R
, Xa
和P
進行加密的對稱密鑰。 (參見上面的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.