繁体   English   中英

如何解密C#中JavaScript的RSA加密字符串?

[英]How to decrypt RSA encrypted string from JavaScript in C#?

我有一个非对称 RSA 密钥对存储在两个单独的文件中。 我想在我的postbuild.js GULP 脚本中生成一个新的对称密钥并使用公共 RSA 密钥对其进行加密,因此用户无法访问它。 然后我想将它发送到C#服务器,在那里它会被解密并使用。

我在Node.js中使用如下JavaScript代码进行加密:

const generateAndEncryptKey = () => {
    const symmetricKey = crypto.randomBytes(32);
    const publicKey = fs.readFileSync("pubkey.pem", "utf8");
    const encryptedSymmetricKey = crypto.publicEncrypt({
        key: publicKey,
        padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
        oaepHash: "sha256",
    }, Buffer.from(symmetricKey)).toString("base64");
    return encryptedSymmetricKey;
}

上面的代码以某种方式工作并生成一个 base64 字符串,我稍后将其发送到服务器。 我不确定这是否是执行此操作的正确方法。

但我无法在 C# 中找到解密此字符串的方法。我尝试使用 BouncyCastle 库和以下代码:

public string DecryptKey(string encryptedKey) {
    var privateKey = @"-----BEGIN RSA PRIVATE KEY-----
...shortened...
-----END RSA PRIVATE KEY-----";

    var bytesToDecrypt = Convert.FromBase64String(encryptedKey);
    var decryptEngine = new Pkcs1Encoding(new RsaEngine());
    using (var txtreader = new StringReader(privateKey)) {
        AsymmetricCipherKeyPair keyPair = (AsymmetricCipherKeyPair)new PemReader(txtreader).ReadObject();
        decryptEngine.Init(false, keyPair.Private);
    }
    var decrypted = Encoding.UTF8.GetString(decryptEngine.ProcessBlock(bytesToDecrypt, 0, bytesToDecrypt.Length));
    return decrypted;
}

但是ProcessBlock方法总是抛出InvalidCipherTextException “未知块类型”。

有人可以帮助我找出我做错了什么或指出另一种更好的方法来实现这一目标吗?

使用 C# 代码解密失败,因为在 NodeJS 代码中OAEP /SHA256 用作填充,而在 C# 代码中使用PKCS#1 v1.5填充。 为了解密工作,两个填充必须相同。 C# 代码中的填充可以适应 NodeJS 代码的填充,如下所示:

var decryptEngine = new OaepEncoding(new RsaEngine(), new Sha256Digest());

此外,解密的密钥不能被 UTF-8 解码,因为这会破坏数据。 它要么作为byte[]返回,要么如果需要转换为字符串,则必须使用合适的二进制到文本编码,例如 Base64 或十六进制。

通过这些更改,解密在 C# 代码中起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM