机器!任何 加密 </跨度> 方法会做。 XML文件内容如下:
&LT;根&GT; &LT; LIC&GT; &LT;数&GT; 19834209&LT; /数&GT; &LT;期满&GT; 02/02/2002和LT; /终止&GT; &LT; / LIC&GT;&LT; /根&GT;
有些人可以给我一个示例吗?问题是msdn示例encyptions使得xml文件被加密但是当我在另一台机器上解密时它不起作用。例如
我试过这个样本:如何:使用加密XML元素 非对称 </跨度> 钥匙,但这里有一些有点会话,在另一台机器上它说坏数据phewf! 锟斤拷
如果你使用私钥签署&lt; lic&gt;会更酷element并将结果添加到文件中(可能在&lt; hash&gt;元素中)。这将使每个人都可以阅读xml文件,以防您的支持需要知道许可证号或到期日期,但如果没有私钥,他们不能更改任何值。
验证签名所需的公钥是常识。
的 澄清 强> 对代码进行签名只会保护代码免受更改,并且不会隐藏其中的任何信息。您的原始问题提到了加密,但我不确定是否需要隐藏数据,或者只是保护数据不被修改。
示例代码:(从不发布PrivateKey.key。只有在签署xml文件时才需要ServerMethods,只有在验证xml文件时才需要ClientMethods。)
using System; using System.Diagnostics; using System.IO; using System.Security.Cryptography; using System.Text; using System.Xml; public static class Program { public static void Main() { if (!File.Exists("PublicKey.key")) { // Assume first run, generate keys and sign document. ServerMethods.GenerateKeyPair(); var input = new XmlDocument(); input.Load("input.xml"); Debug.Assert(input.DocumentElement != null); var licNode = input.DocumentElement["lic"]; Debug.Assert(licNode != null); var licNodeXml = licNode.OuterXml; var signedNode = input.CreateElement("signature"); signedNode.InnerText = ServerMethods.CalculateSignature(licNodeXml); input.DocumentElement.AppendChild(signedNode); input.Save("output.xml"); } if (ClientMethods.IsValidLicense("output.xml")) { Console.WriteLine("VALID"); } else { Console.WriteLine("INVALID"); } } public static class ServerMethods { public static void GenerateKeyPair() { var rsa = SharedInformation.CryptoProvider; using (var keyWriter = File.CreateText("PublicKey.key")) keyWriter.Write(rsa.ToXmlString(false)); using (var keyWriter = File.CreateText("PrivateKey.key")) keyWriter.Write(rsa.ToXmlString(true)); } public static string CalculateSignature(string data) { var rsa = SharedInformation.CryptoProvider; rsa.FromXmlString(File.ReadAllText("PrivateKey.key")); var dataBytes = Encoding.UTF8.GetBytes(data); var signatureBytes = rsa.SignData(dataBytes, SharedInformation.HashAlgorithm); return Convert.ToBase64String(signatureBytes); } } public static class ClientMethods { public static bool IsValid(string data, string signature) { var rsa = SharedInformation.CryptoProvider; rsa.FromXmlString(File.ReadAllText("PublicKey.key")); var dataBytes = Encoding.UTF8.GetBytes(data); var signatureBytes = Convert.FromBase64String(signature); return rsa.VerifyData(dataBytes, SharedInformation.HashAlgorithm, signatureBytes); } public static bool IsValidLicense(string filename) { var doc = new XmlDocument(); doc.Load(filename); var licNode = doc.SelectSingleNode("/root/lic") as XmlElement; var signatureNode = doc.SelectSingleNode("/root/signature") as XmlElement; if (licNode == null || signatureNode == null) return false; return IsValid(licNode.OuterXml, signatureNode.InnerText); } } public static class SharedInformation { public static int KeySize { get { return 1024; } } public static string HashAlgorithm { get { return "SHA512"; } } public static RSACryptoServiceProvider CryptoProvider { get { return new RSACryptoServiceProvider(KeySize, new CspParameters()); } } } }
这是您对XML文档进行数字签名和验证的方式 签署XML文档
如果你想要加密和解密的相同密钥,你应该使用对称方法(这就是定义,真的)。这是与您的样本最接近的一个(相同的来源)。 http://msdn.microsoft.com/en-us/library/sb7w85t6.aspx
发布的示例无效,因为它们没有使用相同的密钥。不仅在不同的机器上:在同一台机器上运行程序两次也不应该工作(对我来说不起作用),因为它们每次都使用不同的随机密钥。 尝试在创建密钥后添加此代码:
key = new RijndaelManaged(); string password = "Password1234"; //password here byte[] saltBytes = Encoding.UTF8.GetBytes("Salt"); // salt here (another string) var p = new Rfc2898DeriveBytes(password, saltBytes); //TODO: think about number of iterations (third parameter) // sizes are devided by 8 because [ 1 byte = 8 bits ] key.IV = p.GetBytes(key.BlockSize / 8); key.Key = p.GetBytes(key.KeySize / 8);
现在程序使用相同的密钥和初始向量,加密和解密应该适用于所有计算机。 另外,请考虑重命名 key 至 algorithm ,否则这是非常误导。我会说这是来自MSDN的一个糟糕的,不好用的例子。
key
algorithm
<子> 的 注意 强> : PasswordDeriveBytes.GetBytes() 由于内部存在严重(安全)问题而被弃用 PasswordDeriveBytes 类。上面的代码已被重写以使用更安全 Rfc2898DeriveBytes 而不是类(PBKDF2而不是PBKDF1)。使用上面生成的代码 PasswordDeriveBytes 可能会受到损害。 子>
PasswordDeriveBytes.GetBytes()
PasswordDeriveBytes
Rfc2898DeriveBytes
也可以看看: 使用PKBDF2-SHA256时推荐的迭代次数?
首先,如果你想使用相同的密钥进行加密和解密,你应该看一下 的 对称密码学 强> 。非对称加密是指用于加密和解密的密钥不同的时候。只是让你知道 - RSA是不对称的,TripleDES和Rijndael是对称的。还有其他一些,但.NET没有它们的默认实现。
我建议学习 System.Security.Cryptography namespace 。并学习一点所有的东西。它拥有加密和解密文件以及生成密码所需的一切。特别是,您可能对这些类感兴趣:
System.Security.Cryptography namespace
CryptoStream
RijndaelManaged
MSDN中还有一些用于每个用例的示例。您可以使用这些类来加密任何文件,而不仅仅是XML。但是,如果您只想加密少数几个元素,可以查看 System.Security.Cryptography.Xml 命名空间。我看到你已经找到了一篇关于它的文章。请继续关注该页面上的链接,您将了解有关这些课程的更多信息。
System.Security.Cryptography.Xml