如何签署文本文件,或xml以外的任何文件

时间:2016-09-30 06:40:48

标签: c# x509certificate

如何签署包含常规文本的文件?

我马上解释。
我在C#中创建了一个应用程序,它允许您使用USB令牌上的证书签署XML文档。我从集合中选择了一个证书:

<?php
     if ($someViewCoutn > 0 ) {
         return;
     }
     $someViewCoutn++
?>
// rest of blade tebplate

然后我使用到目前为止所做的一切,签署这个xml文档:

XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlString);
X509Certificate2 myCert = null;
X509Store st = new X509Store();
st.Open(OpenFlags.ReadOnly);
X509Certificate2Collection collection = X509Certificate2UI.SelectFromCollection(st.Certificates, "Choose certificate:", "", X509SelectionFlag.SingleSelection);

实际问题
我的问题是,如何使用纯文本文件来做同样的事情。我的意思是当我使用签名软件时,我可以看到几乎相同的文件,除了文本(而不是xml)在base64中编码。
我在C#中使用哪些方法来签署常规文件?我无法将其加载到public static string SignXmlWithCertificate(XmlDocument Document, X509Certificate2 cert) { SignedXml signedXml = new SignedXml(Document); // pure black magic signedXml.SigningKey = cert.PrivateKey; // Create a reference to be signed. Reference reference = new Reference(); reference.Uri = ""; // Add an enveloped transformation to the reference. XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform(true); reference.AddTransform(env); //canonicalize XmlDsigC14NTransform c14t = new XmlDsigC14NTransform(); reference.AddTransform(c14t); KeyInfo keyInfo = new KeyInfo(); KeyInfoX509Data keyInfoData = new KeyInfoX509Data(cert); KeyInfoName kin = new KeyInfoName(); kin.Value = "Public key of certificate"; RSACryptoServiceProvider rsaprovider = (RSACryptoServiceProvider)cert.PublicKey.Key; RSAKeyValue rkv = new RSAKeyValue(rsaprovider); keyInfo.AddClause(kin); keyInfo.AddClause(rkv); keyInfo.AddClause(keyInfoData); signedXml.KeyInfo = keyInfo; // Add the reference to the SignedXml object. signedXml.AddReference(reference); // Compute the signature. signedXml.ComputeSignature(); // Get the XML representation of the signature and save // it to an XmlElement object. XmlElement xmlDigitalSignature = signedXml.GetXml(); Document.DocumentElement.AppendChild( Document.ImportNode(xmlDigitalSignature, true)); return Document.OuterXml; } ,因为它不是XML。

我知道你无论如何都会问,所以是的。我试过在谷歌找到它,但我想我只是用错误的词来搜索它。所以任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

为了使用数字签名对文件进行签名,必须有一个可用于区分文件数据和签名块的模式。例如,脚本文本文件(例如.ps1,.vbs,.js等)具有这样的模式,其中签名放在文件末尾的注释块中。类似的方法用于复杂的文档类型,.pdf,.docx等。

由于文本文件没有这样的模式,因此您必须引入新的文件类型并定义用于定义文件内容和签名结构的规则。

如果无法对文本文件强制执行规则,则可以使用目录签名。在这种情况下,您将文本文件哈希值放在目录文件(.cat)中并对其进行数字签名。

答案 1 :(得分:-4)

您可以在MS Word和Open Office中签名.txt。确切的方法取决于您使用的版本。