前言
使用RSA密钥对不仅可以用来加密数据,还可以用来进行签名。前者使用公钥进行加密,私钥进行解密;后者使用私钥进行签名,用公钥验证签名。
平台
- Node.js - v12.14.0
- VS2019 - v142 && v100
- CryptoPP 8.5.0
密钥对文件格式
公钥:test_pub.pem
1 | -----BEGIN PUBLIC KEY----- |
私钥:test_prv.pem
1 | -----BEGIN PRIVATE KEY----- |
跨端验证
原本想使用RSASSA-PSS算法(RSA Signature Scheme with Appendix - Probabilistic Signature Scheme)进行签名和验证,这也是
crypto++
的PSS模式默认使用的签名算法;但是Node.js似乎不支持该算法,无论是node-rsa还是crypto,其自身只能调用PSS算法,关于RSASSA-PSS简单查了一下没找到现有的解决方案,在这一方面就先不折腾太多,先退而求其次使用PKCS1模式。
签名:Node.js
1 | const fs = require('fs'); |
验证:C++
1 |
|
使用各种工具实现的签名和验证
由于不同工具和平台的算法对于PSS模式的签名实现各不相同(应该只是某些细节参数设置不同),只能保证在其自身的工具集中签名和验证相匹配,一旦使用A签名B验证或者B签名A验证等方式,就很难做到全都能验证通过。
这里先做一个记录,关于Node-RSA, node.js/crypto, crypto++…自身实现的PSS模式签名和验证的方法。
Node.js: Node-RSA
使用PSS(Probabilistic Signature Scheme)签名模式,签名函数为sha256
1 | const fs = require('fs'); |
Node.js: crypto
使用Node.js自带的crypto模块进行签名(Node-RSA的底层也是crypto),签名模式是PSS,签名算法是sha256。
1 | const fs = require('fs'); |
C++: CryptoPP
加密模式为PSS,加密算法为sha256。其中,公钥和私钥字符串不包含文件的首尾行。
1 |
|