无法解密使用react-native-rsa加密的消息

问题描述 投票:0回答:1

我有一个后端服务实用程序(基于这个要点),如下所示:

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

我在这里做错了什么?

node.js react-native rsa node-crypto
1个回答
0
投票

您尚未显示来自客户端的任何代码,但您指向的 RSA 库的代码仅使用 RSA 以及名称不佳的 “PKCS#1 padding”,而不是 PKCS#1 v2 中引入的 OAEP 填充.

启用加密技术时,首先了解加密技术的基础知识非常重要,这样您才能了解您使用的方案是否匹配。您不能只读取“RSA”或“AES”并期望实现匹配。


此外,我强烈建议研究要使用哪些库。您正在使用的 React RSA 库似乎是一个废弃的单人项目,其开放问题可以追溯到 2018 年,并且 3 年来没有看到任何重大编辑。 Github 页面确实需要维护者。

我称之为“包装库”,为了方便起见,它包装了常见的低级功能 - 它主要与其自身兼容。它甚至没有列出加密的执行方式或任何限制。

请停止使用这样的垃圾。如果原作者因此感到冒犯:请停止发布此类垃圾; Github 不是转储你自己废弃的项目的合适地方。

© www.soinside.com 2019 - 2024. All rights reserved.