繁体   English   中英

Diffie-Hellman实现不适用于更大的数字

[英]Diffie-Hellman implementation doesn't work for bigger numbers

上下文

我在看DHE解释的这段视频

它讨论了两个人如何可以在没有吸管的情况下交换密钥以了解更多信息。

根据视频的实现

// INITIALIZERS (video's values)-------------------------

var prefx = 3
var modulo = 17

// SECRET NUMBERS ---------------------------------------

var alice_secret_number = 19 // replaced 54 since there is a precision loss with it.
var bob_secret_number = 24

// PUBLIC KEYS ------------------------------------------

var public_alice = Math.pow(prefx , alice_secret_number) 
var public_bob = Math.pow(prefx , bob_secret_number)

// Check potential overflow -----------------------------
console.log(public_alice , public_bob)

// Apply the modulo -------------------------------------
public_alice %= modulo
public_bob %= modulo

// Check the value again --------------------------------
console.log( public_alice , public_bob )

// Calculate the good number ------------------------------------------
var final_alice = Math.pow( public_bob , alice_secret_number ) % modulo
var final_bob = Math.pow( public_alice , bob_secret_number ) % modulo

console.log( final_alice , final_bob )

问题

这并不总是有效。 首先,例如javascript会失去精度。 因此,您只能尝试使用较小的数字。 演讲者谈论大模数。 即使是很小的人也做不到。 我给你的代码不是针对性能而是为了可读性而设计的。

有人可以对我做错的事情给我他/她的意见吗?

JavaScript中的所有数字都是浮点数(实际上是双精度数)。 相应的规范是IEEE 754 要表示一个整数而又不损失精度,它必须适合64位浮点数的53位大尾数 您可以使用Number.MAX_SAFE_INTEGER检查最大整数,该整数为9007199254740991。超出此范围的所有内容都会失去精度。

为什么这是个问题? (大多数)密码术必须是精确的,否则将无法得知秘密。 您尝试执行的操作是对幂求幂,然后应用模数,但是由于分别进行此操作,因此在求幂后,您会得到很大的数值,然后才能通过模数运算将其减少。

解决方案是使用某种BigNumber库(例如BigInteger )为您处理所有这些大数字。 请注意,特别是有一个modPow(exp, mod)函数,它将这两个步骤结合起来并有效地计算结果。

请注意,用户机密应小于模数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM