我有一个后端服务实用程序(基于这个要点),如下所示:
import crypto from 'crypto';
interface KeyPair {
publicKey: string;
privateKey: string;
}
export class RSAController {
static async generateKeys(): Promise<KeyPair> {
return new Promise((res, rej) => {
crypto.generateKeyPair(
'rsa',
{
modulusLength: 2048,
},
(err, publicKeyObject, privateKeyObject) => {
if (err) rej(err);
const publicKey = publicKeyObject.export({
type: 'pkcs1',
format: 'pem',
});
const privateKey = privateKeyObject.export({
type: 'pkcs1',
format: 'pem',
});
res({
publicKey: publicKey as string,
privateKey: privateKey as string,
});
},
);
});
}
static encrypt({ data, publicKey }: { data: string; publicKey: string }) {
const encryptedData = crypto.publicEncrypt(
{
key: publicKey,
padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
oaepHash: 'sha256',
},
Buffer.from(data),
);
return encryptedData.toString('base64');
}
static decrypt({ encryptedData, privateKey }: { encryptedData: string; privateKey: string }) {
const decryptedData = crypto.privateDecrypt(
{
key: privateKey,
padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
oaepHash: 'sha256',
},
Buffer.from(encryptedData, 'base64'),
);
return decryptedData.toString();
}
}
如果我尝试在后端加密并随后解密字符串,则有效:
const { privateKey, publicKey } = await RSAController.generateKeys();
const encryptedData = await RSAController.encrypt({ data: 'hello world', publicKey });
console.log('encryptedData', encryptedData);
const decryptedData = await RSAController.decrypt({ encryptedData, privateKey });
console.log('decryptedData', decryptedData); // works fine, I see "hello world"
react-native-rsa-native
库,它首先在前端进行加密,然后再将消息发送到后端。
这就是我的问题出现的地方,因为如果我只使用
RSAController
,加密和随后的解密工作正常,但是如果我使用客户端库的 RSA.decrypt
方法加密,然后尝试在后端使用 RSAController
解密它
,我发现了错误,
error:02000079:rsa routines::oaep decoding error
我在这里做错了什么?
您尚未显示来自客户端的任何代码,但您指向的 RSA 库的代码仅使用 RSA 以及名称不佳的 “PKCS#1 padding”,而不是 PKCS#1 v2 中引入的 OAEP 填充.
启用加密技术时,首先了解加密技术的基础知识非常重要,这样您才能了解您使用的方案是否匹配。您不能只读取“RSA”或“AES”并期望实现匹配。
此外,我强烈建议研究要使用哪些库。您正在使用的 React RSA 库似乎是一个废弃的单人项目,其开放问题可以追溯到 2018 年,并且 3 年来没有看到任何重大编辑。 Github 页面确实需要维护者。
我称之为“包装库”,为了方便起见,它包装了常见的低级功能 - 它主要与其自身兼容。它甚至没有列出加密的执行方式或任何限制。
请停止使用这样的垃圾。如果原作者因此感到冒犯:请停止发布此类垃圾; Github 不是转储你自己废弃的项目的合适地方。