C# 验证C中Crypto Node.JS生成的RSA签名#

C# 验证C中Crypto Node.JS生成的RSA签名#,c#,node.js,rsa,signing,C#,Node.js,Rsa,Signing,我正在尝试使用Express/NodeJS构建一个web服务,它对一条信息进行签名。签名数据由用C#编写的客户端接收和验证。你必须原谅我在密码学及其相关技术方面缺乏经验 首先,我使用OpenSSL为C#client生成证书,为NodeJS应用程序生成私钥 openssl请求-x509-新密钥rsa:4096-keyout key.pem-out cert.pem-天 365 在NodeJS应用程序中,我有以下代码 const crypto = require('crypto') const fs

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

首先,我使用OpenSSL为C#client生成证书,为NodeJS应用程序生成私钥

openssl请求-x509-新密钥rsa:4096-keyout key.pem-out cert.pem-天 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;
pub
是在Base64中生成的证书,它存储在
常量字符串中。
数据
包含与NodeJS应用程序中的
标识符
相同的信息,但使用
Convert.FromBase64String(…)
将其转换为字节,同样地,
签名
是从NodeJS应用程序中的
sig
返回的数据,仅从Base64转换为字节数据

插入所有信息时,
VerifyData()
返回false,这使我相信web服务和客户端的加密配置之间存在某种不匹配


有什么想法吗?

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

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


谢谢你的快速回复

通常,当RSA在c#和JSON之间出现问题时,它是填充模式。c#中的默认填充模式与JSON中的不同。为什么c#code Base64中的
data
被解码?在NodeJS代码中,这不会发生,因为
标识符
是UTF8编码的(默认情况下,因为在
update()
中没有指定显式编码)。C#对应的应该是
Encoding.UTF8.GetBytes()
。我不认为填充是问题所在,因为
sign.sign()
默认情况下应用PKCS1 v1.5填充,这也在C#code中使用。@Topaco这就是问题所在,感谢您指出这一点!
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());
    }
}