【问题标题】:"How to Diffie Hellman" using RSA and JavaScript“如何区分 Hellman” 使用 RSA 和 JavaScript
【发布时间】:2018-08-21 13:45:25
【问题描述】:

如何使用 Diffie Hellman 密钥交换与 JavaScript 中现有的 base64 RSA 2048 位而非 PEM 编码的密钥对来获取共享密钥?我收到以下无效密钥错误:

const crypto = require('crypto');
const myRsa2048PrivateKey = 'CAASqAkwggSkAgEAAoIBAQCRQHzwWADGZcNS+aiUV7dW81489bEFsuFYUWGtOxW4UdpCuo1/yJ5GNEFY7FJDaQ194J28JAU8RDrxQqQawKyZ7CqINjqQni9VedgqkVWC9tDKrvaT7YxzeBjj/L0K3sMuAXMzhwRtOaD/DUfmJnZRgffJFFlT69D+nXx3Z2cywSiz5lK4M9Ua35jV/lxfS2RD+8Jf15cN4rGK8CtyKj0oLAyBDWKTf1zEzkDqS/fc1GhuFVyGymz/XvJ4COePuzJN2VX5hUewn5FZDnGz+6CG3xVXiEg4xZu7iF6Hmv7mBnqOecJuaPB2/O/ocUXrR+XuTTdf+KVvoxBDae2WXHd1AgMBAAECggEAYN1ptHproeNRW+9kbfEFMjZAPVT3xb4iK1yyT+0cMfxcGq4AGRx3+Id2oM+QmKXhOnXlmwdGeodh62yutaySLl/hiU7oxXLITC9iahjbtufUG6aMh+AeDw8jQj9U7n/aF78dzVoYKKMK66w2q5QwyXBsByvL2nxjtrjdvV824hAPGbSytfq8fcj6QZ7OsnzuJVC2195flwfoS0FVhyVm25iYJhIg9gsU+AfJJ2BanW0/eESjorIkFa7aWDKQZ7EzC/9iOdwNInSwGiDQcCQPiYhu+CvPgApTR791IJOkHYJhGN6xXY8QqfSYCwXCe6BYYU6Rg6eMw4vYoqjNKjEmbQKBgQDJrhcTWz0oTPNw/yWoXchnIZSxGQXOKe1bXI8xLZ5kxZjdiFeCx5Ndgp00+An8mYmUeQsIWGqsAVI3kTt45RiL2EPrrvoLMu7til8Ya5w7G1F3GQCNtSWCXCPhDwnmgPr/kgxjQoJSpVhVyEAlQl1/eomNMF7+FVzCN5ftniiXIwKBgQC4X6iA/e98M7jnFONloaaZMW2D/093JbeRYam6e67R8R6Ipq5Y4X6e7R0PWTqSZe2f8KKJCu6Q09vd9sg6MyhHIMtj7Da+GItmmRn5enxwdrw5E56plMVrwd0dBx14kT4G1M8DnjZeyWfoObVHzYyU0mRLdriVoJ57XkFr4CZshwKBgQCrsC9mxAJBP5jyddKqDQRgf17kkKe3hUvRve8Mb4hqwyhKVxogdCPItDt+bzWZO1+67Hxu404UFZ/XPCTD20vVKQtRJQkp5Xcu8t/XmyxJyQzF9ZvaBv7ihevpWPMVrnF+hedTzLfDAY08oZex4FhWAIv+jNIhPTBVChylJUHqvwKBgQCxJAcLV+7eD/uY2XLZVIRyLxEffw7kVLKX1ZNy/h4qy1UgybQ85Pn4y6vd8UbbHV8/Cb2/mWc4crSN/+rEMB6EqDeB25OE9KQKgRJ5pXsluo6A8B7Co5NCQtKkbw+bpUBI4/G5ciqeyzcv4TIQuKZW3gVKk9gouldKBHcqpAOGxQKBgGS4NZw0olJYO8LQx+/D0EhGFSiSj1PvMXm+VB+5RhrLQSJK/CfzeofIZn729wxjfoqvS8UJlR9muNyjte5WC5PfWdmsohmx1p8hdldswJwTPDuLSlcDSDSt97PfloTWlh+juT+NprYRtN5kBYufR5Gx82TXB2agmDJkfo+YPhtH';
const othersRsa2048PublicKey = 'CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCOuz9TgU1k/QWHSwveWO0skQJ6irsao3PL8JpCKX1kFWeIaDHN3vfiRus7UpK81NE3WeThAw4ALSXrwkc3NFmopNp5NqHsf6kbKAI9YukuLR3AIwo41AYxIt5BlWHz5jyRLxi77MoHdnppaclALxm53fb7kMUHXsjiFTxE88V05ngpe4rPMadYbdecy6lfKc79Pb+dI+JshGGbjjj7LGa+FQbw1isgjD2erYBj18OST8f6qp1e8WHWiqT+8RyWRXqJs1EtSRr49GDWx1tiLuPXa02Ct69gCvz2pkwV0YoWQUfKAH5mWGTXr4WP4fds4qn/jk9VlAXnO5CkoTziJPGfAgMBAAE=';
const df = crypto.createDiffieHellman(myRsa2048PrivateKey, 'base64');
console.log(df.computeSecret(othersRsa2048PublicKey, 'base64'));

【问题讨论】:

  • 你使用的是哪个 Node.js 版本?
  • @ruiquelhas 10.8.0
  • 并不重要,因为 API 基本相同,至少从 v4.1 开始。我错过了 RSA 位,这是重要的部分。请参阅下面的答案。

标签: javascript node.js cryptography diffie-hellman


【解决方案1】:

你不能。 RSA 操作依赖于与 Diffie-Hellman(离散对数问题或 DLP)不同的难题(trapdoor RSA)。因此,他们使用大小相似但 不同 的键。所以RSA私钥不能直接用于DH操作。

您可以做的是生成一个临时(临时)Diffie Hellman 密钥对,使用它来计算秘密,然后验证 Diffie 的公钥 - 和其他安全相关信息-Hellman 密钥交换。 RSA 可用于通过生成签名进行身份验证。

您可以查看 TLS 规范 - 特别是以 DHE_ 开头的密码套件 - 以大致了解如何执行此操作。


另一种不太安全的方法,更易于实施,但不提供前向安全性,它是使用 RSA 公钥加密会话密钥,然后将其发送到其他站点。如果该站点可以解密并获得正确的密钥,则您认为它已通过身份验证(例如,通过评估由该密钥创建的 MAC 身份验证标签或从该密钥派生的密钥)。

这是由以RSA_ 开头的 TLS 密码套件实现的(由于上述原因,在 1.3 版中已弃用)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 2013-06-03
    • 2021-04-14
    • 1970-01-01
    • 2014-10-02
    • 2017-05-14
    • 1970-01-01
    相关资源
    最近更新 更多