C# RSA使用.Net签名并使用OpenSSL命令验证

C# RSA使用.Net签名并使用OpenSSL命令验证,c#,openssl,cryptography,rsa,C#,Openssl,Cryptography,Rsa,我试图使用Sha1散列和RSA用C#对一个简单的数据进行签名,然后用OpenSSL命令进行验证 在我的测试中,我使用了Windows上预先存在的localhost证书 下面是与C#一起使用的代码: static void Main(字符串[]args) { 字符串sValTest=“sampledata”; 字节[]签名=符号(sValTest,“localhost”); 字符串b64=Convert.tobase64字符串(签名); bool verified=验证(sValTest,签名,@

我试图使用Sha1散列和RSA用C#对一个简单的数据进行签名,然后用OpenSSL命令进行验证

在我的测试中,我使用了Windows上预先存在的localhost证书

下面是与C#一起使用的代码:

static void Main(字符串[]args)
{
字符串sValTest=“sampledata”;
字节[]签名=符号(sValTest,“localhost”);
字符串b64=Convert.tobase64字符串(签名);
bool verified=验证(sValTest,签名,@“pathToCer”);
}
静态字节[]符号(字符串文本、字符串主题)
{
X509Store my=新的X509Store(StoreName.my,StoreLocation.LocalMachine);
my.Open(OpenFlags.ReadOnly);
RSACryptServiceProvider csp=null;
foreach(我的证书中的X509Certificate2证书)
{
if(cert.Subject.Contains(certSubject))
{
csp=(RSACyptoServiceProvider)cert.PrivateKey;
打破
}
}
sha1管理的sha1=新的sha1管理的();
字节[]数据=Enconding.ASCII.GetBytes(文本);
字节[]散列=sha1.ComputeHash(数据);
返回csp.SignHash(hash,CryptoConfig.MapNameToOID(“SHA1”);
}
静态bool验证(字符串文本、字节[]签名、字符串certPath)
{
X509Certificate2 cert=新的X509Certificate2(certPath);
rsacryptserviceprovider csp=rsacryptserviceprovider)cert.PublicKey.Key;
sha1管理的sha1=新的sha1管理的();
字节[]数据=Encoding.ASCII.GetBytes(文本);
字节[]散列=sha1.ComputeHash(数据);
返回csp.VerifyHash(hash,CryptoConfig.MapNameToOID(“SHA1”),签名);
}
(在该示例中,
verified
产生
true

我将PFX的公共部分以及签名作为base 64发送到我的linux计算机

然后,我做了以下工作:

base64——解码sig.b64>sig
openssl x509-通知der-in localhost.cer-out localhost.pem
opensslx509-pubkey-noout-in localhost.pem>localhost.pub.pem
echo-n“sampledata”| openssl dgst-验证localhost.pub.pem-签名信号
验证失败
结束

我检查了两边证书的序列号,它匹配。 以防万一,我还检查了两个电台的签名md5,一切正常


是否有任何关于明显失败位置的指针?

openssl dgst
命令中缺少哈希算法标识符,该命令默认为MD5

你正确的最后一行是

echo -n "sampledata" | openssl dgst -verify localhost.pub.pem -signature sig -sha1

我猜测(这只是猜测)这是使用16位Unicode字符:
unicodeincoding=newunicodeincoding
;虽然这是使用8位干净的ASCII:
echo-n“sampledata”
@jww,但我在另一个代码部分中使用了UTF8,只是为了确保我再次尝试使用ASCII,没有帮助,我绝对确定这默认为sha1,应该再验证10次。。。非常感谢。