java - 在 NodeJs 中使用私钥进行 RSA 解密
问题描述
我正在集成第三方 API 服务,为了安全起见,他们要求我们以加密格式交换信息。因此,他们要求我创建一个 RSA 公钥/私钥并与他们共享公钥。
这就是他们告诉我的
4096 位公钥证书。用于加密和解密。(Zip 文件)或需要公钥自签名证书(4096 位格式)。证书格式应为 X.509 证书应以“Begin Certificate”开头并以“End Certificate”结尾</p>
加密过程:-
- 具有 RSA 4096 位公钥(证书)的非对称加密(RSA_Encrypt),模式/填充为 ECB/PKCS1。
- Base64 编码。
- 在加密过程中,合作伙伴应使用我们的公钥证书。
解密过程:-
- Base64解码
- 使用合作伙伴私钥证书进行非对称解密(RSA_Decrypt)。
所以,我运行了以下命令并给了他们公钥证书
openssl req -x509 -sha256 -nodes -newkey rsa:4096 -keyout private.key -out public.pem
而且,就我而言,我编写了以下函数来使用他们的公钥加密并使用我的私钥解密
async function RSA_Encrypt(str) {
const publicKey =
fs.readFileSync(path.resolve("./their/UAT_PUBLIC_CERT.txt"), "utf8");
const buffer = Buffer.from(str);
const encrypted = publicEncrypt({ key: publicKey, padding:
constants.RSA_PKCS1_PADDING }, buffer);
return encrypted.toString("base64");
}
async function RSA_Decrypt(str) {
const privateKey = fs.readFileSync(path.resolve("./my/private.key"),
"utf8");
const buffer = Buffer.from(str, "base64");
const decrypted = privateDecrypt({ key: privateKey, padding:
constants.RSA_PKCS1_PADDING }, buffer);
return decrypted.toString("utf8");
}
现在,我通过使用RSA_Encrypt
函数加密请求正文向他们发送请求。他们用加密的响应回复,在使用RSA_Decrypt
函数解密响应时,我收到以下错误
error:04065072:rsa routines:RSA_EAY_PRIVATE_DECRYPT:padding check failed
此外,我已经使用我的公钥测试了加密并使用我的私钥进行了解密,这工作正常。这是我为测试目的编写的函数,
function RSA_Encrypt(str) {
const publicKey = fs.readFileSync(path.resolve("./my/public.pem"), "utf8");
const buffer = Buffer.from(str);
const encrypted = crypto.publicEncrypt({ key: publicKey, padding:
crypto.constants.RSA_PKCS1_PADDING }, buffer);
return encrypted.toString("base64");
}
function RSA_Decrypt(str) {
const privateKey = fs.readFileSync(path.resolve("./my/private.key"), "utf8");
const buffer = Buffer.from(str, "base64");
const decrypted = crypto.privateDecrypt({ key: privateKey, padding:
crypto.constants.RSA_PKCS1_PADDING }, buffer);
return decrypted.toString("utf8");
}
我认为这是一些填充或模式问题,但我无法自己解决。我可以在privateDecrypt
函数中指定 ECB 模式吗?他们这边的加密很可能发生在 JAVA 中,那么我在 NodeJs 中遗漏了什么吗?
解决方案
推荐阅读
- arrays - 列表初始化仍然为空
- vscode-extensions - 在 Visual Studio Code 扩展测试中模拟用户击键
- python - 使用 sqlite3 python 错误进行数据库搜索
- python - 如何由用户启动进程,而不是在 Python 中继续使用 Selenium
- azure-devops - 检索已发布 Azure DevOps 工件的正确方法
- javascript - 什么事件可以用来检测输入的值已经改变,Angular
- xcode - 更新“未在指定位置找到 SDK”后,Visual Studio 2019 无法连接到 Mac 安装的 Visual Studio for Mac
- objective-c - 重置/重新初始化 NSXPCConnection?
- python - Python:如何使用瓶子从本地主机获取某个 url?
- android - 当我单击图标时,它不会显示页面(LİSTVİEW IndexedStack)