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