2013-10-17 54 views
2

我正在嘗試實施Diffie-Hellman密鑰交換。由於內存限制,我正在處理大數字,JavaScript無法以小數形式處理。大HEX號碼的操作

我想執行操作g^a mod p = A其中變量的長度是在512和1536位之間。

由於內存限制,我不知道如何解決這樣的等式。我不能將變量轉換成小數點,然後解決它。

我試圖找到用來在進制數進行數學運算的JavaScript庫,但我沒能找到任何

注: 我將使用SSL,所以不用擔心的JavaScript代碼注入。

+1

你可能會發現這裏的東西:[BigInteger的庫爲JS(http://www.joseprio.com/blog/2013/ 4月27日/ BigInteger的文庫換JS /)。這真的是一個內存問題,或者JavaScript使用IEEE 754浮點數? – RobG

+0

當試圖使用JS的本地函數parseInt(Hex,16)將HEX轉換爲十進制時,它返回無窮大。 – thedethfox

+0

我已經檢查了大整數庫。 – thedethfox

回答

1

我設法做到了。

1)下載bigInt庫。我用過這個: http://www.leemon.com/crypto/BigInt.html

2)用它來生成大數字或將現有數字轉換爲bigInt對象。

We need to calculate: g^a mod p = A 

可以被翻譯成下面的JavaScript代碼:

var a = randBigInt(1536);       // Generate (a) 
var p = str2bigInt(my_prime_as_string, 16);   // convert p into a bigInt 
var g = str2bigInt(my_primitive_root_as_string, 16); // convert q into a bigInt 

var y = powMod(g,Y, p); // Calculate the common secret key. 
1

首先,在計算g^a mod p時,首先不計算指數,然後執行mod,因爲這樣數字變得非常大。相反,你在每一步都採用模數,所以你不必處理大於p^2的數字。

要計算指數,您可能需要使用平方算法的指數運算,記住在每個平方和每次乘法之後取模。

請參閱:http://en.wikipedia.org/wiki/Exponentiation_by_squaring(看看那裏的基本menthod)。

但是真的,任何好的JavaScript bignum庫都應該爲你做。如果你不得不問,你無法自己實現密碼功能。密碼學很難。 (例如,我上面描述的方法具有時間邊信道攻擊,所以它不適合玩玩具)。找到其他人已經完成辛苦工作的圖書館,並學習如何正確使用它。