You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用node-rsa加密时出现no inverse错误的技术求助

解决Node.js中node-rsa导入RSA公钥时的BN_mod_inverse:no inverse错误

问题根源

你当前的代码错误地将**十进制格式的模数(n)和指数(e)**当作十六进制字符串来转换Buffer,导致node-rsa解析出的公钥参数完全不符合预期,最终触发了BN_mod_inverse:no inverse错误(本质是解析后的e与φ(n)不互质,不符合RSA的核心要求)。

正确实现步骤

要正确导入十进制的n和e,需要先将其转换为BigInt,再转为大端序的Buffer(RSA公钥参数采用大端字节序存储)。

修正后的代码

const NodeRSA = require('node-rsa');

// 十进制的模数和指数
const modulusDecimal = '24130287975021244042702223805688721202041521798556826651085672609155097623636349771918006235309701436638877260677191655500886975872679820355397440672922966114867081224266610192869324297514124544273216940817802300465149818663693299511097403105193694390420041695022375597863889602539348837984499566822859405785094021038882988619692110445776031330831112388738257159574572412058904373392173474311363017975036752132291687352767767085957596076340458420658040735725435536120045045686926201660857778184633632435163609220055250478625974096455522280609375267155256216043291335838965519403970406995613301546002859220118001163241';
const exponentDecimal = '415029';

// 将十进制字符串转为BigInt
const nBigInt = BigInt(modulusDecimal);
const eBigInt = BigInt(exponentDecimal);

// 辅助函数:将BigInt转为大端序Buffer
function bigIntToBufferBE(bigInt) {
    let hex = bigInt.toString(16);
    // 确保十六进制字符串长度为偶数,不足补前导0
    if (hex.length % 2 !== 0) {
        hex = '0' + hex;
    }
    return Buffer.from(hex, 'hex');
}

// 创建node-rsa实例并导入公钥组件
const key = new NodeRSA();
key.importKey({
    n: bigIntToBufferBE(nBigInt),
    e: bigIntToBufferBE(eBigInt)
}, 'components-public');

// 加密示例:前缀+卡号的组合,注意这里的明文编码要和Java端一致(通常是UTF-8或ASCII)
const prefix = '你的前缀值';
const cardNumber = '测试卡号';
const plaintext = prefix + cardNumber;

// 加密并转为Base64字符串(注意加密的输入输出编码,这里用utf8转明文,输出base64)
const encryptedString = key.encrypt(plaintext, 'base64', 'utf8');
console.log(encryptedString);

关键说明

  1. BigInt处理大数字:你的模数是非常大的整数,超过了JavaScript Number的精度范围,必须用BigInt来处理才能保证数值准确。
  2. 大端序Buffer转换:RSA公钥的模数和指数要求以大端字节序存储,所以转换时要确保十六进制字符串转Buffer的顺序正确。
  3. 明文编码一致性:加密前的明文(前缀+卡号)的编码格式必须和Java端完全一致(比如都是UTF-8),否则加密结果会不匹配。

内容的提问来源于stack exchange,提问作者inquisitivemongoose

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 01:33:24