【问题标题】:DSA signature c#DSA 签名 c#
【发布时间】:2018-06-29 04:29:32
【问题描述】:

Certificate我有证书

这是我必须验证的文字:

B5080F731EE89EC82FD2E8B22E9_I_CANNOT_SHOW_THE_REAL_TEXT

这是签名:

MIIBUwYJKoZIhvcNAQcCoIIBRDCCAUACAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3DQEHATGCAR8wggEbAgEBMG8wZDELMAkGA1UEBhMCREUxHDAaBgNVBAoTE1NBUCBUcnVzdCBDb21tdW5pdHkxEzARBgNVBAsTClNBUCBXZWIgQVMxFDASBgNVBAsTC0kwMDIwMjEyMzYwMQwwCgYDVQQDEwNFMTUCByASBQYIEQgwCQYFKw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE4MDYyNzE5MzcyNVowIwYJKoZIhvcNAQkEMRYEFDgpp0877pKaChyIGVw5sPeD0W03MAkGByqGSM44BAMEMDAuAhUA4PH8bdBPHHtuPHvhJxjei%2BFrJYUCFQCnZ6IABDiRlctS9E9N3IQK60JLIg%3D%3D

找不到使用 c# 验证签名的方法。当我使用“正常”DSACryptoServiceProvider 时,我总是收到错误消息,说签名大小应该是 40 字节。

我只需要知道要去。使用方法 我知道是DSA。 我知道签名大约是 500 字节

这是我正在尝试的代码:

DSACryptoServiceProvider csp = (DSACryptoServiceProvider)CurrentCer.csp.PublicKey.Key;

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

var base64EncodedBytes = System.Convert.FromBase64String(signature);
result = csp.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), base64EncodedBytes);

DSASignatureDeformatter verifier = new DSASignatureDeformatter(csp);
verifier.SetHashAlgorithm("SHA1");
bool valid = verifier.VerifySignature(hash, base64EncodedBytes);

【问题讨论】:

  • 我已经读过你的帖子好几遍了,不知道你在问什么。你有证书。好的。你找不到方法来做“这个”。 这个是什么?
  • 为什么你一句话说签名应该只有40个字节,而别处你说你知道签名是500个字节?
  • 嗨,艾米。这是验证签名。我在证书中有公钥、要验证的签名和要验证的文本
  • 当我使用“正常”的 DSACryptoServiceProvider 时,我总是收到错误消息,说签名大小应该是 40 字节。我收到一个 500 字节的签名

标签: c# dsa


【解决方案1】:

您的数据本身并不是签名。它是带有分离内容的 CMS 签名数据的查询字符串编码 base64 编码表示,并且恰好已使用 DSA 进行签名。

str = Uri.UnescapeDataString(str);
byte[] signatureMessage = Convert.FromBase64String(str);
ContentInfo content = new ContentInfo(yourDataHere);
SignedCms signedCms = new SignedCms(content, detached: true);
signedCms.Decode(signatureMessage);

SignerInfoCollection signers = signedCms.SignerInfos;

if (signers.Count != 1 || signers[0].Certificate != null)
{
    // Reject it, this isn't what you're looking for.
    // At least, based on the sample you gave.
    //
    // You could, for Count == 1, accept Certificate == null or
    // Certificate.RawData.SequenceEqual(CurrentCer.RawData),
    // if you're so inclined.
}

// This throws if the signature doesn't check out.
signedCms.CheckSignature(new X509Certificate2Collection(CurrentCer), verifySignatureOnly: true);

【讨论】:

  • 嗨 bartonjs,我收到异常“哈希值不正确”。这是否意味着签名没有经过验证?
  • @Henrique 正确。输入字节、输入(或存储)证书和现有签名的组合不能一起使用,如果您的输入是文本,请确保它不是 Unix 与 Windows 的直线重新解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
  • 2013-11-27
  • 2011-08-17
  • 2018-09-17
  • 2011-10-27
  • 1970-01-01
  • 2014-02-24
相关资源
最近更新 更多