我正在嘗試實施Diffie-Hellman密鑰交換。由於內存限制,我正在處理大數字,JavaScript無法以小數形式處理。大HEX號碼的操作
我想執行操作g^a mod p = A
其中變量的長度是在512和1536位之間。
由於內存限制,我不知道如何解決這樣的等式。我不能將變量轉換成小數點,然後解決它。
我試圖找到用來在進制數進行數學運算的JavaScript庫,但我沒能找到任何
注: 我將使用SSL,所以不用擔心的JavaScript代碼注入。
我正在嘗試實施Diffie-Hellman密鑰交換。由於內存限制,我正在處理大數字,JavaScript無法以小數形式處理。大HEX號碼的操作
我想執行操作g^a mod p = A
其中變量的長度是在512和1536位之間。
由於內存限制,我不知道如何解決這樣的等式。我不能將變量轉換成小數點,然後解決它。
我試圖找到用來在進制數進行數學運算的JavaScript庫,但我沒能找到任何
注: 我將使用SSL,所以不用擔心的JavaScript代碼注入。
我設法做到了。
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.
首先,在計算g^a mod p
時,首先不計算指數,然後執行mod
,因爲這樣數字變得非常大。相反,你在每一步都採用模數,所以你不必處理大於p^2
的數字。
要計算指數,您可能需要使用平方算法的指數運算,記住在每個平方和每次乘法之後取模。
請參閱:http://en.wikipedia.org/wiki/Exponentiation_by_squaring(看看那裏的基本menthod)。
但是真的,任何好的JavaScript bignum庫都應該爲你做。如果你不得不問,你無法自己實現密碼功能。密碼學很難。 (例如,我上面描述的方法具有時間邊信道攻擊,所以它不適合玩玩具)。找到其他人已經完成辛苦工作的圖書館,並學習如何正確使用它。
你可能會發現這裏的東西:[BigInteger的庫爲JS(http://www.joseprio.com/blog/2013/ 4月27日/ BigInteger的文庫換JS /)。這真的是一個內存問題,或者JavaScript使用IEEE 754浮點數? – RobG
當試圖使用JS的本地函數parseInt(Hex,16)將HEX轉換爲十進制時,它返回無窮大。 – thedethfox
我已經檢查了大整數庫。 – thedethfox