在 C# 中验证由 Crypto Node.JS 创建的 RSA 签名

Verifying a RSA signature made by Crypto Node.JS in C#

我正在尝试使用 Express/NodeJS 来构建 Web 服务,它会签署一条信息。签名数据由用 C# 编写的客户端接收和验证。请原谅我在密码学及其相关技术方面缺乏经验。

首先,我为 C# 客户端 生成一个 证书 和一个 私钥 对于 NodeJS 应用程序 使用 OpenSSL;

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365

NodeJS 应用程序 中,我有以下代码;

const crypto = require('crypto')
const fs = require('fs')

var pem = fs.readFileSync('./keys/key.pem');
var key = pem.toString('ascii');
var privateKey = crypto.createPrivateKey({
    'key': key,
    'format': 'pem',
    'passphrase': '<PASSPHRASE>',
});

function sign(identifier){
    var sign = crypto.createSign('RSA-SHA256');
    sign.update(identifier);
    var sig = sign.sign(privateKey, 'base64');
    return sig;
}

exports.sign = sign;

此时参数identifier为待签名的数据。客户端将收到此消息,并生成签名,sig.

在 C# 客户端中,我有以下代码片段;

X509Certificate2 cert = new X509Certificate2(Convert.FromBase64String(pub));
using (var sha256 = SHA256.Create())
{
    using (var rsa = cert.GetRSAPublicKey())
    {
        bool results = rsa.VerifyData(data, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
        Console.WriteLine(results.ToString());
    }
}

pub是Base64生成的证书,保存在const string中。 data 包含与 NodeJS 应用程序中的 identifier 相同的信息,但它使用 Convert.FromBase64String(...) 转换为字节,同样 signature 是从 [=14= 返回的数据] 在NodeJS应用中,只是从Base64转为byte数据。

插入所有信息后,VerifyData() returns 错误,这使我相信 Web 服务和客户端的加密配置之间存在某种不匹配。

有什么想法吗?

正如评论中所指出的,问题是当 NodeJS 应用程序中的数据从 UTF-8 读取时,C# 客户端中的 data 被转换为 Base64。

解决方案是使用 Encoding.UTF8.GetBytes()

转换字符串

感谢您的快速回复!