cryptography - 使用 "node-forge"、 "exponent"和 "modulus"在 "maxdigits"中生成 key 对

标签 cryptography cryptojs forge

我正在使用“node-forge”生成一个公钥以与我的 AES 对称 key 一起使用,但我不知道如何使用后端提供的数据来创建此公钥。目前,我从身份验证 API 收到以下内容:

e: "10001" n:"c7c5dd235568711a943ebbdacac890ca2cf12c1ab539f77726e8874d2ab4220cf06369358b5eff0425fb17d4f696f741cf04c5ea874415e7f67d118a2e763e641e8675b8f42e9277b3f70f14e4de23fe16f51abdc427490f47e4b28ae3e5eb3563ba797fe90f9b70ba878646b1b297c52ba735827682b67309d38b423e31b50b" maxdigits: "131"

其中“e”是我的指数,“n”是我的模块,“maxdigits”是我的 BigIntegers 应该具有的长度。

但是当我尝试这样的事情时:

const keys = forge.pki.rsa.generateKeyPair({ e: res.e, n: res.n });

我的后端返回错误。我做错了什么?

最佳答案

forge.pki.rsa.generateKeyPair 在这种情况下是错误的方法。 forge.pki.rsa.generateKeyPair 创建一个具有随机模数的 key 对。第一个参数指定模数/ key 大小(以位为单位),第二个参数指定指数( [1][2] ):

// var forge = require('node-forge'); // in nodejs-context
var pki = forge.pki;
var rsa = forge.pki.rsa;

var keypair = rsa.generateKeyPair({bits: 2048, e: 0x10001});
var pubKeyPEM = pki.publicKeyToPem(keypair.publicKey);
var privKeyPEM = pki.privateKeyToPem(keypair.privateKey);
console.log(pubKeyPEM);
console.log(privKeyPEM);

forge.pki.rsa.setPublicKey-方法用于通过模数和指数生成公钥,其中模数是第一个参数,指数是第二个参数 ( [2] ),均为 forge.jsbn.BigInteger 类型 ( [3] ):

var BigInteger = forge.jsbn.BigInteger;
var n = new BigInteger('c7c5dd235568711a943ebbdacac890ca2cf12c1ab539f77726e8874d2ab4220cf06369358b5eff0425fb17d4f696f741cf04c5ea874415e7f67d118a2e763e641e8675b8f42e9277b3f70f14e4de23fe16f51abdc427490f47e4b28ae3e5eb3563ba797fe90f9b70ba878646b1b297c52ba735827682b67309d38b423e31b50b', 16);
var e = new BigInteger('10001', 16);
var pubKey = rsa.setPublicKey(n, e);

var pubKeyPEM = pki.publicKeyToPem(pubKey)
console.log(pubKeyPEM); // Check with e.g. https://lapo.it/asn1js/

关于cryptography - 使用 "node-forge"、 "exponent"和 "modulus"在 "maxdigits"中生成 key 对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58540207/

相关文章:

c - 在将 fread() 转换为整数时,如果文件大小不是 4 字节的倍数会怎样?

postman - 预请求 CryptoJS 脚本中的 "TypeError: Cannot read property ' sigBytes ' of undefined"错误

javascript - 使用两个不同的 key 加密/解密

php - 为什么要在 forge laravel 中重新安装存储库并更改 env 中的数据?

java - 在 Java 中使用 RSA 私钥加密

Java AES CBC解密第一 block

javascript - Javascript JSON.stringify 和 PHP json_encode 一样吗?

javascript - 锻造查看器 : Zoom in on a asset inside a room (front of the asset)

android - 是否可以监听物理 Android 后退按钮上的触摸?

c - 在Linux内核空间使用MD5