我正在尝试实现Diffie-Hellman密钥交换。我正在使用大数字,由于内存限制,JavaScript无法处理小数形式。
我想执行操作g^a mod p = A
,其中变量的长度在512到1536位之间。
由于内存限制,我不知道如何解决这个等式。我无法将变量转换为小数,然后解决它。
我试图找到用于对Hex数字执行数学运算的JavaScript库,但我没有设法找到任何
注意: 我将使用SSL,所以不要担心JavaScript代码注入。
答案 0 :(得分:1)
首先,在计算g^a mod p
时,您不先计算指数然后再计算mod
,因为这样数字变得非常大。相反,你在每一步都采用模数,所以你永远不必处理大于p^2
的数字。
要计算指数,您可能需要通过平方算法使用取幂,记住在每次平方后和每次乘法后取模数。
请参阅:http://en.wikipedia.org/wiki/Exponentiation_by_squaring(请查看基本的menthod)。
但实际上,任何优秀的JavaScript bignum库都应该为你做到这一点。
如果你不得不问,你自己没有能力实施加密功能。密码学很难。 (例如,我上面描述的方法有定时侧通道攻击,所以它不适合玩具以上)。找一个其他人已经完成了艰苦工作的图书馆,并学习如何正确使用它。
答案 1 :(得分: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.