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
相关产品推荐
相关产品推荐

