当前位置: 首页 > 知识库问答 >
问题:

RSA私钥无法解密数据

万俟招
2023-03-14

我正在使用JavaScript和Node.js处理一个消息传递项目。创建用户时,服务器使用node.jscrypto库生成RSA键区。私钥使用用户密码加密。在webapp上,当用户A向用户B发送消息时,使用用户B的公钥对数据进行加密。当用户B接收到消息时,使用他们的私钥和密码对消息进行解密。

我的问题是,虽然应用程序似乎可以加密数据,但我无法解密数据。抛出的错误消息实际上是“无法解密数据”,这是没有帮助的。

// Generate public/private keypairs
exports.generateKeyPair = (password) => {
    return new Promise((resolve, reject) => {
        crypto.generateKeyPair('rsa', {
            modulusLength: 4096,
            publicKeyEncoding: {
                type: 'spki',
                format: 'pem'
            },
            privateKeyEncoding: {
                type: 'pkcs8',
                format: 'pem',
                cipher: 'aes-256-cbc',
                passphrase: password
            }
        }, (err, publicKey, privateKey) => {
                if (err) reject(err);
                else resolve([publicKey, privateKey]);
        });
    })
}
var crypto = require('crypto');

window.encrypt = function (data, publicKey) {
    let buffer = Buffer.from(data);
    let encrypted = crypto.publicEncrypt(publicKey, buffer);
    return encrypted.toString('base64');
}

window.decrypt = function(data, privateKey, password) {
    let buffer = Buffer.from(data, 'base64');
    let decrypted = crypto.privateDecrypt({
        key: privateKey,
        passphrase: password
    }, buffer);
    return decrypted.toString('utf8');
}

与UI交互的客户端代码:

var sendMsg = function() {
    let token = $('#token').val();
    let toUser = $('#toUser').val();
    let message = btoa($('#sendMessage').val());
    fetch(`/keypairs/public/${toUser}?token=${token}`)
    .then((res) => res.json())
    .then((json) => {
        if (json.code != 200) throw 'Error';
        else return json.data.pubKey;
    })
    .then((pubKey) => encrypt(message, pubKey))
    .then((encrypted) => $('#send-result').html(encrypted))
    .catch((err) => alert(err));
};

var decryptMsg = function() {
    let token = $('#token').val();
    let encrypted = $('#decrypt-text').val();
    let password = $('#decrypt-pass').val();

    fetch(`/keypairs/private?token=${token}`)
    .then((res) => res.json())
    .then((json) => {
        if (json.code != 200) throw 'Error';
        else return json.data.privKey;
    })
    .then((privKey) => decrypt(encrypted, privKey, password))
    .then((decrypted) => $('#decrypt-result').html(decrypted))
    .catch((err) => (console.error(err), alert(err))); // <-- this line gives useless info
};

我将加密的数据粘贴到字段#'decrypt-text中。我还传递用户B密码。在登录过程中检索令牌,以便将用户与数据库中的键相关联。正如我提到的,我得到的唯一错误是“无法解密数据”。有什么想法吗?也许我需要生成pkcs1类型的密钥?

共有1个答案

常英毅
2023-03-14

我想出来了。问题是当我创建公钥时,类型是spkipkcs8。由于某种原因,将两者都更改为pkcs1并重新生成密钥可以修复它。我还尝试将type:'pkcs8传递给decrypt函数,但没有成功。

 类似资料:
  • 我一直在搜索,但我似乎找不到一个简单的方法解密使用RSA。 我生成了一个公钥和私钥,它们存储在两个单独的文件中,并且是XML格式的。使用FromXmlString将公钥关联到RSACryptoServiceProvider对象,然后加密一个字符串,这一点没有问题。当我试图解密一个加密的字符串时,我的困惑就来了。我不确定如何将私钥数据与RSACryptoServiceProvider关联,以便使用D

  • 我有一个公钥和一个私钥,还有一个字符串,我想要解密。 公钥的格式如下: 私钥的格式如下: 我要解密的字符串已经使用公钥加密,然后我需要使用私钥解密它。

  • 我在使用Java Bouncycastle的客户机和使用Python RSA库的密钥服务器之间交换私钥时遇到了困难。PEM格式用于通过REST传输密钥。keyserver无法解密我提供的密钥(加密密码更改时需要),它需要PKCS#1或PKCS#8密钥和PEM,如下所示: 但是BouncyCastle的输出(使用JCEpeEncryptorBuilder和JcaMiscPEMGenerator)的起

  • 我试图通过RSA加密字符串。我也有java样本,但我不能正确地将其转换为c#。 RSA示例: 这是我在c#中生成的代码,但我的c#代码结果与javaCode结果不同。我的代码怎么了?

  • 并且我将这个函数称为用RSA公钥加密DSA密钥的函数:

  • 本文向大家介绍基于私钥加密公钥解密的RSA算法C#实现方法,包括了基于私钥加密公钥解密的RSA算法C#实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了基于私钥加密公钥解密的RSA算法C#实现方法,是一种应用十分广泛的算法。分享给大家供大家参考之用。具体方法如下: 一、概述 RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。 RSA是被研究得最广泛的公钥算法,从提出