Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
DSA签名c#_C#_Dsa - Fatal编程技术网

DSA签名c#

DSA签名c#,c#,dsa,C#,Dsa,我有证书 这是我必须验证的文本: B5080F731EE89EC82FD2E8B22E9无法显示“真实”文本 这是签署的: MiibuwyjkozihvcnacaqexczajbgurdgGuardgGuamasgsgsib3dqhattc8wggebagebmg8wzdelmakga1ebhmcruxhdaabgqnvg1tb21dw5dhkxezarbgnvbgxxxvmxfqdqwgqdqwqdqwqdqdqwqwqdqwqwqwqwqwqwqwqwqwkkkkkkkkwkkkkkkkkk

我有证书

这是我必须验证的文本:

B5080F731EE89EC82FD2E8B22E9无法显示“真实”文本

这是签署的:

MiibuwyjkozihvcnacaqexczajbgurdgGuardgGuamasgsgsib3dqhattc8wggebagebmg8wzdelmakga1ebhmcruxhdaabgqnvg1tb21dw5dhkxezarbgnvbgxxxvmxfqdqwgqdqwqdqwqdqdqwqwqdqwqwqwqwqwqwqwqwqwkkkkkkkkwkkkkkkkkkkkkkkkkkkkkkkwkkkkkkjbgqwkkkkkkkkjjjjjjjjjjkkkkkkkkkkkkwzzzzzzzzyyyyzzzzzyyyYEFDGPP0877PKACHYIGVW5SPED0W03MAKGBYQGSM44BAMEMDAUAHUA4PH8DBPHHTUPHVHJXJEI%2BFrJYUCFQCnZ6IABDiRlctS9E9N3IQK60JLIg%3D%3D

找不到用c#验证签名的方法。当我使用“normal”
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);

你的数据本身不是一个签名。它是一个查询字符串编码的base64编码的CMS签名数据的表示形式,带有分离的内容,并且它碰巧是用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);

我已经看过你的帖子好几次了,不知道你在问什么。你有证书。可以你找不到一个方法来做这个。这是什么?为什么你在一句话中说签名应该只有40个字节,而在其他地方你说你知道签名是500个字节?嗨,艾米。这是为了验证签名。我在证书中有公钥,要验证的签名和要验证的文本当我使用“普通”DSACryptoServiceProvider时,我总是会收到一个错误,说签名大小应该是40字节。我收到一个500字节的签名Hi bartonjs,我得到一个异常“哈希值不正确”。这是否意味着签名未经验证?@Henrique正确。输入字节、输入(或存储)证书和现有签名的组合不在一起,如果您的输入是文本,请确保它不是Unix vs Windows beeline重新解释。