c# - 使用 .Net 进行 RSA 签名并使用 OpenSSL 命令进行验证

标签 c# openssl cryptography rsa

我正在尝试使用 C# 使用 Sha1 哈希和 RSA 对简单数据进行签名,然后使用 OpenSSL 命令对其进行验证。

对于我的测试,我获取了 Windows 上预先存在的本地主机证书。

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

static void Main(string[] args)
{
    string sValTest = "sampledata";
    byte[] signature = Sign(sValTest, "localhost");
    string b64 = Convert.ToBase64String(signature);
    bool verified = Verify(sValTest, signature, @"pathToCer");
}

static byte[] Sign(string text, string certSubject)
{
    X509Store my = new X509Store(StoreName.My, StoreLocation.LocalMachine);
    my.Open(OpenFlags.ReadOnly);

    RSACryptoServiceProvider csp = null;
    foreach (X509Certificate2 cert in my.Certificates)
    {
        if (cert.Subject.Contains(certSubject))
        {
            csp = (RSACryptoServiceProvider)cert.PrivateKey;
            break;
        }
    }

    SHA1Managed sha1 = new SHA1Managed();
    byte[] data = Enconding.ASCII.GetBytes(text);
    byte[] hash = sha1.ComputeHash(data);

    return csp.SignHash(hash, CryptoConfig.MapNameToOID("SHA1"));
}

static bool Verify(string text, byte[] signature, string certPath)
{
    X509Certificate2 cert = new X509Certificate2(certPath);
    RSACryptoServiceProvider csp = RSACryptoServiceProvider)cert.PublicKey.Key;

    SHA1Managed sha1 = new SHA1Managed();
    byte[] data = Encoding.ASCII.GetBytes(text);
    byte[] hash = sha1.ComputeHash(data);

    return csp.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), signature);
}

(在那个例子中,verified 产生 true)

我将 PFX 的公共(public)部分以及 base 64 签名发送到我的 linux 计算机。

然后我做了以下事情:

base64 --decode sig.b64 > sig
openssl x509 -inform der -in localhost.cer  -out localhost.pem
openssl x509 -pubkey -noout -in localhost.pem > localhost.pub.pem
echo -n "sampledata" | openssl dgst -verify localhost.pub.pem -signature sig

验证失败结束。

我检查了两边证书的序列号,是一致的。 为了以防万一,我还检查了两个站签名的md5,都清楚。

关于明显失败之处的任何指示?

最佳答案

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

你正确的最后一行是

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

关于c# - 使用 .Net 进行 RSA 签名并使用 OpenSSL 命令进行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41555792/

相关文章:

c# - PdfTextExtractor.GetTextFromPage 突然给出空字符串

c - 十六进制打印中的零跳过

encryption - 使用 RSA-1024 签名 SHA-256 摘要 : what is the size?

c# - RX - 如何订阅条件状态,但仅当此状态在 x 时间段内没有变化时?

c# - 从 C# (Windows) 调用 C 函数 (Linux)

c# - 在 C# 中使用字典时出错

c++ - Poco c++ Crypto 静态库的使用在 XCode 构建中产生错误

java - 为 Android 创建 facebook 哈希 key

javascript - 使用 OpenSSL 在 Ruby 中编码和字节错误?

encryption - RSA 在加密句子时如何工作?