我正在尝试实现 Diffie-Hellman 密钥交换。由于内存限制,我正在处理 JavaScript 无法以十进制形式处理的大数字。
我想执行g^a mod p = A
变量长度在 512 到 1536 位之间的操作。
由于内存限制,我不知道如何求解这样的方程。我无法将变量转换为小数然后求解。
我试图找到用于对十六进制数字执行数学运算的 JavaScript 库,但我没有找到任何
注意: 我将使用 SSL,所以不用担心 JavaScript 代码注入。
我正在尝试实现 Diffie-Hellman 密钥交换。由于内存限制,我正在处理 JavaScript 无法以十进制形式处理的大数字。
我想执行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 (查看那里的基本方法)。
但实际上,任何好的 JavaScript bignum 库都应该为您做到这一点。
如果你不得不问,你没有能力自己实现加密功能。密码学很难。(例如我上面描述的方法有定时侧信道攻击,所以它不仅仅适合玩具)。找到其他人已经完成了艰苦工作的图书馆,并学习如何正确使用它。