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

Node.js中使用X509 RSA 2048公钥加密卡数据报错求解决

问题背景

CardData数据格式示例:

PAN=4300000000000777;ExpDate=0519;CardHolder=IVAN PETROV;CVV=111

该数据以key=value结构用分号分隔,需通过X509 RSA 2048公钥加密,加密后的二进制结果再做Base64编码。

现有NodeRSA实现代码:

const key = new NodeRSA();
key.importKey(this._publicKey, 'pkcs8-public');
const encrypted = key.encrypt(cardData, 'base64');

其中this._publicKey为银行提供的X509格式RSA 2048公钥明文,执行后触发错误:

Card data blocking error.
排查与修复方案
  • 修正公钥导入格式:银行提供的X509公钥若为带-----BEGIN PUBLIC KEY-----/-----END PUBLIC KEY-----头的PEM格式,需确认导入参数是否匹配。若公钥是PKCS#8格式则用pkcs8-public,若为标准X509 PEM格式,尝试改用public作为导入格式:
    key.importKey(this._publicKey, 'public');
    
    同时检查公钥是否存在多余换行、空格或缺失头尾标识,必要时手动补全。
  • 指定RSA填充模式:多数银行要求使用PKCS#1 v1.5填充,而NodeRSA默认采用OAEP填充,需显式设置:
    const key = new NodeRSA();
    key.importKey(this._publicKey, 'pkcs8-public');
    key.setOptions({ encryptionScheme: 'pkcs1' }); // 强制使用PKCS#1 v1.5填充
    const encrypted = key.encrypt(cardData, 'base64');
    
  • 校验CardData格式合法性:
    • 确保键名严格匹配要求(如PAN/ExpDate/CardHolder/CVV大小写是否符合银行规范)
    • 检查分号分隔是否无多余/遗漏,无换行、空格等冗余字符
    • 确认ExpDate格式为MMYY(如示例中的0519代表2019年5月),无格式错误
  • 验证公钥有效性:用OpenSSL工具校验公钥是否为合法的RSA 2048公钥:
    # 将公钥保存为public_key.pem后执行
    openssl rsa -pubin -in public_key.pem -text -noout
    
    若命令报错,需联系银行重新获取有效公钥。
  • 确认Base64编码方式:部分系统要求标准Base64编码,可尝试手动转换二进制结果避免NodeRSA默认编码差异:
    const encryptedBuffer = key.encrypt(cardData, 'buffer');
    const encryptedBase64 = encryptedBuffer.toString('base64');
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:52:51