签名问题
我签名完了没有ds前缀什么原因?大神帮忙看看
我的签名:
<MessageSuit><Message id="355010000172201804161131"><Plain id="FCReq"><version>1.0.1</version><transId>FCReq</transId><merId>355010000172</merId><stages>1003</stages><amount>0.01</amount><currency>156</currency></Plain></Message><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /><Reference URI="#FCReq"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /><DigestValue>Iq5k121poJVvYzs8OPxs3+X3xGU=</DigestValue></Reference></SignedInfo><SignatureValue>pl5AJ2KLqv4LQAq23VCzMOI4c7Yja+9rxXk+VItL3wKQeCAnEgRQvAkYigvsemA08TYF5To/PX2C
ERLdDUfQnKOOs+1s1NLG3qRS97VeMswddkKTC+2AHQkVymyi986xxZAKFrSsXAGzBiDBXFD1iW7j
7wThQGszM5GIqLr9f5E=</SignatureValue></Signature></MessageSuit>
正确签名:
<MessageSuit><Message id=""><Plain id="FCReq"><version>1.0.1</version><transId>FCReq</transId><merId>355010000172</merId><stages>1003</stages><amount>0.01</amount><currency>156</currency></Plain><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></ds:CanonicalizationMethod>
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></ds:SignatureMethod>
<ds:Reference URI="#FCReq">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></ds:DigestMethod>
<ds:DigestValue>Iq5k121poJVvYzs8OPxs3+X3xGU=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
SNPUMrwiqxVBbO38Oft+wHcEQh0ySLhNlKZvNDq2DhTYEtKhI666YSg+U8bkA8euYBoF75grCSHz
sroSHmWOOQYd6xGJ5LlraJssEWWgX2UkE2XpH3rUdVUclCPX0xWplQwsZp+GtWcXumrUb1GXl2yv
4HFUgYMyI6zbr0I60rY=
</ds:SignatureValue>
</ds:Signature></Message></MessageSuit>
我的代码:
/// <summary>
/// xml报文签名
/// </summary>
/// <param name="xmlDoc">xml 的文档对象</param>
/// <param name="key">商户私钥</param>
/// <param name="uri">资源指定位置</param>
/// <returns>签名后字符串</returns>
private string signXml(XmlDocument xmlDoc, RSA key, string uri)
{
//创建xml签名对象
SignedXml signedXml = new SignedXml(xmlDoc);
//指定私钥
signedXml.SigningKey = key;
//指定标准化:http://www.w3.org/TR/2001/REC-xml-c14n-20010315
signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigC14NTransformUrl;
//指定签名方法:rsa-sha1
signedXml.SignedInfo.SignatureMethod = SignedXml.XmlDsigRSASHA1Url;
//设置keyInfo为null
signedXml.KeyInfo = null;
//创建引用对象
Reference reference = new Reference();
reference.Uri = "#" + uri;
//指定Signature标签与原xml报文的组装方式:enveloped
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);
//向签名对象中添加引用
signedXml.AddReference(reference);
try
{
//计算数字签名
signedXml.ComputeSignature();
}
catch (CryptographicException e)
{
//uri不正确
throw new System.ArgumentException("E0008:签名使用的uri不正确,商户上送uri为:" + uri);
}
//获取签名后的xml
XmlElement xmlDigitalSignature = signedXml.GetXml();
//把签名加入到文档中
xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true));
//获取SignatureValue标签的值,然后每76个字节增加一个换行
string signatureValue = xmlDoc.GetElementsByTagName("SignatureValue").Item(0).InnerText;
//设置xml文档中的SignatureValue标签的值
xmlDoc.GetElementsByTagName("SignatureValue").Item(0).InnerText = splitPer76AddLineBreak(signatureValue);
return xmlDoc.OuterXml;
}