Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/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
C# CheckSignature返回false_C#_Signedxml - Fatal编程技术网

C# CheckSignature返回false

C# CheckSignature返回false,c#,signedxml,C#,Signedxml,我有一个问题,简单签名上的CheckSignature总是失败。 我使用SignXml对一些外部数据(在我的例子中是AS4有效负载的一部分)进行签名,这些数据将存储为MIME附件 以下是代码(修改后的MS示例): 静态字符串flXML=@“D:\Test\Example.xml”; 静态字符串flSignedXML=@“D:\Test\SignedExample.xml”; 私有无效按钮1\u单击(对象发送者,事件参数e) { 尝试 { //生成签名密钥。 rsacryptserviceprov

我有一个问题,简单签名上的CheckSignature总是失败。 我使用SignXml对一些外部数据(在我的例子中是AS4有效负载的一部分)进行签名,这些数据将存储为MIME附件

以下是代码(修改后的MS示例):

静态字符串flXML=@“D:\Test\Example.xml”;
静态字符串flSignedXML=@“D:\Test\SignedExample.xml”;
私有无效按钮1\u单击(对象发送者,事件参数e)
{
尝试
{
//生成签名密钥。
rsacryptserviceprovider Key=新的rsacryptserviceprovider();
CreateSomeXml(flXML);
SignXmlFile(flXML,flSignedXML,Key);
bool result=VerifyXmlFile(flSignedXML,Key);
如果(结果)
{
WriteLine(“XML签名有效”);
}
其他的
{
WriteLine(“XML签名无效”);
}
}
捕获(加密异常ee)
{
控制台写入线(ee.Message);
}
}
公共静态void CreateSomeXml(字符串文件名)
{
WriteAllText(文件名“”);
}        
private static readonly FieldInfo RefTargetTypeField=typeof(Reference).GetField(“m_refTargetType”,BindingFlags.Instance | BindingFlags.NonPublic);
private static readonly FieldInfo RefTargetField=typeof(Reference).GetField(“m_refTarget”,BindingFlags.Instance | BindingFlags.NonPublic);
公共静态void SignXmlFile(字符串文件名、字符串SignedFileName、RSA密钥)
{
XmlDocument doc=新的XmlDocument();
doc.Load(新的XmlTextReader(文件名));
SignedXml SignedXml=新的SignedXml(doc);
signedXml.SigningKey=Key;
byte[]Content=System.Text.Encoding.UTF8.GetBytes(“1234567890asdfghjkl”);
流=新的内存流(内容);
var attachmentReference=新引用(uri:“cid:xml样本”){DigestMethod=”http://www.w3.org/2001/04/xmlenc#sha256" };
常量int streamReferenceTargetType=0;
SetValue(attachmentReference,streamReferenceTargetType);
RefTargetField.SetValue(附件引用,流);
signedXml.AddReference(attachmentReference);
//计算签名。
signedXml.ComputeSignature();
XmlElement xmlDigitalSignature=signedXml.GetXml();
doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature,true));
如果(doc.FirstChild是XML声明)
{
RemoveChild医生(FirstChild医生);
}
XmlTextWriter xmltw=新的XmlTextWriter(SignedFileName,新的utf8编码(false));
书面文件(xmltw);
xmltw.Close();
}
公共静态布尔VerifyXmlFile(字符串名称,RSA密钥)
{
XmlDocument XmlDocument=新的XmlDocument();
加载(名称);
SignedXml SignedXml=新的SignedXml(xmlDocument);
XmlNodeList nodeList=xmlDocument.GetElementsByTagName(“签名”);
signedXml.LoadXml((xmlement)节点列表[0]);
{
byte[]Content=System.Text.Encoding.UTF8.GetBytes(“1234567890asdfghjkl”);
流=新的内存流(内容);
var attachmentReference=新引用(uri:“cid:xml样本”){DigestMethod=”http://www.w3.org/2001/04/xmlenc#sha256" };
常量int streamReferenceTargetType=0;
SetValue(attachmentReference,streamReferenceTargetType);
RefTargetField.SetValue(附件引用,流);
signedXml.AddReference(attachmentReference);
}
//检查签名并返回结果。
signedXml.SigningKey=Key;
返回signedXml.CheckSignature();
}
有人知道我做错了什么吗? 另外,我知道我可以为其他引用指定转换。问题是,我如何获得由SignedXml处理的引用结果,以便也可以存储它?
例如,如果我为引用上的转换指定了压缩,那么现在如何获得该压缩的结果?

当签名验证失败时,启用提供有关出错原因的更多信息的记录器会很有帮助

您可以通过将其添加到app.config文件来启用它:

<system.diagnostics>
    <sources>
      <source name="System.Security.Cryptography.Xml.SignedXml" switchName="XmlDsigLogSwitch">
        <listeners>
          <add name="xmlDsigLogFile" />
        </listeners>
      </source>
    </sources>

    <switches>
      <add name="XmlDsigLogSwitch" value="Verbose" />
      <!-- possible values: Off (0) Error (1) Warning (2) Info (3) Verbose (4) -->
    </switches>

    <sharedListeners>
      <add name="xmlDsigLogFile" type="System.Diagnostics.TextWriterTraceListener" initializeData="XmlDsigLog.txt" />
    </sharedListeners>

    <trace autoflush="true">
      <listeners>
        <add name="xmlDsigLogFile" />
      </listeners>
    </trace>
  </system.diagnostics>

如果附件是XML附件,则应使用
XmlDsigExcC14NTransform
转换。如果附件不是XML附件,则不应使用它

<system.diagnostics>
    <sources>
      <source name="System.Security.Cryptography.Xml.SignedXml" switchName="XmlDsigLogSwitch">
        <listeners>
          <add name="xmlDsigLogFile" />
        </listeners>
      </source>
    </sources>

    <switches>
      <add name="XmlDsigLogSwitch" value="Verbose" />
      <!-- possible values: Off (0) Error (1) Warning (2) Info (3) Verbose (4) -->
    </switches>

    <sharedListeners>
      <add name="xmlDsigLogFile" type="System.Diagnostics.TextWriterTraceListener" initializeData="XmlDsigLog.txt" />
    </sharedListeners>

    <trace autoflush="true">
      <listeners>
        <add name="xmlDsigLogFile" />
      </listeners>
    </trace>
  </system.diagnostics>