javascript - Diffie-Hellman Key Exchange with Javascript 有时出错

标签 javascript public-key-encryption diffie-hellman

看完这个视频 http://youtu.be/3QnD2c4Xovk

我一直在尝试一步一步地遵循它,但未能产生相同的结果。

值得注意的是,当我尝试执行 Math.pow(3, 54)%17 时,我得到 7。而演讲者得到 15。

我编写了一个方法,该方法应该使用我在 http://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange 上找到的内容来模拟 Diffie Hellman 的 key 交换。

这是我的代码:

function diffieHellman(generator, prime, alice_secret, bob_secret){
  var alice_public = Math.pow(generator, alice_secret)%prime
    , bob_public = Math.pow(generator, bob_secret)%prime
    , alice_private = Math.pow(bob_public, alice_secret)%prime
    , bob_private = Math.pow(alice_public, bob_secret)%prime;
  console.log("alice"
  , "\n\t", "secret -- ", alice_secret
  , "\n\t", "public -- ", alice_public
  , "\n\t", "private -- ", alice_private
  )
  console.log("bob"
  , "\n\t", "secret -- ", bob_secret
  , "\n\t", "public -- ", bob_public
  , "\n\t", "private -- ", bob_private
  )
  return {
    alice:{
      secret: alice_secret
    , public: alice_public
    , private: alice_private
    },
    bob:{
      secret: bob_secret
    , public: bob_public
    , private: bob_private
    }
  }
};

这些例子有效:

diffieHellman(3, 17, 4, 12) // 1, 1
diffieHellman(3, 23, 6, 19) // 12, 12
diffieHellman(3, 13, 8, 4) // 9, 9

但是,有些数字不起作用

diffieHellman(3, 17, 40, 120) // 13, 0
diffieHellman(3, 23, 16, 129) // 21, 2
diffieHellman(3, 13, 44, 11) // 9, 1

我做错了什么?

编辑——我并不是要在 Javascript 中为项目实现 Diffie-Hellman key 交换。这只是我最熟悉的语言,但我担心这可能是 JavaScript 的限制。

最佳答案

问题是 Javascript 数字的精度有限,这会导致代码中出现舍入错误,其中您首先取幂然后计算模数。对于您的示例数字,您可以通过定期计算求幂内的模数来解决此问题,例如通过在取模之前从不计算超过一个平方。但是对于实际的密码学,您的计算将涉及太大而无法作为 Javascript 数字处理的数字(并且大多数编程语言都存在相同的问题)。通常的方法是使用大整数(甚至任意精度)库。如果您最终实现了自己的密码学,请注意旁路,例如通过调用非恒定时间的库函数或使用数据相关数组索引允许基于缓存的攻击。<​​/p>

关于javascript - Diffie-Hellman Key Exchange with Javascript 有时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24677932/

相关文章:

openssl - 如何从 PEM 格式的 DH key 中提取 DH 参数

c - MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED

Java JVM 热点 ephemeralDHKeySize

php - 如何设置进度条

javascript - 如何使用代码破坏我网站上的第三方 iframe?

php - 使用 PHP 的非对称加密

java - 从 BigInteger 转换为八位字节?

ssh - 通过不安全的连接发送加密 key 的方法?

javascript - AngularJs ng-重复多个 orderBy 和条件

javascript - 使用nodejs应用程序配置redis