繁体   English   中英

使用RSA和JavaScript的“ How to Diffie Hellman”

[英]“How to Diffie Hellman” using RSA and JavaScript

如何使用Diffie Hellman密钥交换和现有的base64 RSA 2048位(不是JavaScript中的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'));

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

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

您可以查看TLS规范-特别是以DHE_开头的密码套件-以获得有关如何执行此操作的总体思路。


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

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

暂无
暂无

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

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