生成密钥的方法:
///
/// 要生成的密钥文件的路径(文件夹)
public static void getRSAKey(string path)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
string datetimestr = System.DateTime.Now.ToString("yyyyMMddHHmmss");
using (StreamWriter writer = new StreamWriter("RSA解密_PrivateKey_" + datetimestr + ".xml")) //这个文件要保密…
{
writer.WriteLine(rsa.ToXmlString(true));
}
using (StreamWriter writer = new StreamWriter("RSA加密_PublicKey_" + datetimestr + ".xml"))
{
writer.WriteLine(rsa.ToXmlString(false));
}
}
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
添加.net引用:System.Security.dll .net2.0及以上支持
#region 操作xml文件(加密解密xml;读取加密xml) /IZ7CU8o164bGlq6pNQvV8nx/Gw/5wALtZpE280tCTmlD6M5Wl8Bjketwqdek+Nh6qRlrdwOpFUlCxZ3girflQ==
private static string rsaKeyname = "wqras";//
//以下加密解密,密钥 就是上面getRSAKey方法生成的xml文件里面的内容了
private static string rsaKey_Encrypt = "
private static string rsaKey_Decrypt = "uQ7KhsO+hTEPV316uYKPzWQr0es++TF62bOcQGitw6hv+IVI20MuPYZ17D04Nne7nmLkFQVu6+2jQqtPATRkkw==
//读取加密过的xml文档
private static XmlDocument GetDecryptXmlDoc(string xmlpath)
{
XmlDocument xmlDoc = new XmlDocument();
try
{
xmlDoc.PreserveWhitespace = true;
xmlDoc.Load(xmlpath);
}
catch (Exception e)
{
return xmlDoc;
}
RSA rsaKey = new RSACryptoServiceProvider();
try
{
rsaKey.FromXmlString(rsaKey\_Decrypt);
//解密xml文档
Decrypt(xmlDoc, rsaKey, rsaKeyname);
//xmlDoc.Save("test.xml");
}
catch (Exception e)
{
}
finally
{
rsaKey.Clear();
}
return xmlDoc;
}
//加密xml
public static void EncryptMyXml(string xmlpath)
{
XmlDocument xmlDoc = new XmlDocument();
try
{
xmlDoc.PreserveWhitespace = true;
xmlDoc.Load(xmlpath);
}
catch (Exception e)
{
return;
}
RSA rsaKey = new RSACryptoServiceProvider();
try
{
rsaKey.FromXmlString(rsaKey_Encrypt);
//加密某节点 Config
Encrypt(xmlDoc, "Config", rsaKey, rsaKeyname);
xmlDoc.Save(xmlpath);
}
catch (Exception e)
{
}
finally
{
rsaKey.Clear();
}
}
//解密xml
public static void DecryptMyXml(string xmlpath)
{
XmlDocument xmlDoc = new XmlDocument();
try
{
xmlDoc.PreserveWhitespace = true;
xmlDoc.Load(xmlpath);
}
catch (Exception e)
{
return;
}
RSA rsaKey = new RSACryptoServiceProvider();
try
{
rsaKey.FromXmlString(rsaKey\_Decrypt);
//解密
Decrypt(xmlDoc, rsaKey, rsaKeyname);
xmlDoc.Save(xmlpath);
}
catch (Exception e)
{
}
finally
{
rsaKey.Clear();
}
}
//xml加密
public static void Encrypt(XmlDocument Doc, string ElementToEncrypt, RSA Alg, string KeyName)
{
// Check the arguments.
if (Doc == null)
throw new ArgumentNullException("Doc");
if (ElementToEncrypt == null)
throw new ArgumentNullException("ElementToEncrypt");
if (Alg == null)
throw new ArgumentNullException("Alg");
////////////////////////////////////////////////
// Find the specified element in the XmlDocument
// object and create a new XmlElemnt object.
////////////////////////////////////////////////
XmlElement elementToEncrypt = Doc.GetElementsByTagName(ElementToEncrypt)\[0\] as XmlElement;
// Throw an XmlException if the element was not found.
if (elementToEncrypt == null)
{
throw new XmlException("The specified element was not found");
}
//////////////////////////////////////////////////
// Create a new instance of the EncryptedXml class
// and use it to encrypt the XmlElement with the
// a new random symmetric key.
//////////////////////////////////////////////////
// Create a 256 bit Rijndael key.
RijndaelManaged sessionKey = new RijndaelManaged();
sessionKey.KeySize = 256;
EncryptedXml eXml = new EncryptedXml();
byte\[\] encryptedElement = eXml.EncryptData(elementToEncrypt, sessionKey, false);
////////////////////////////////////////////////
// Construct an EncryptedData object and populate
// it with the desired encryption information.
////////////////////////////////////////////////
EncryptedData edElement = new EncryptedData();
edElement.Type = EncryptedXml.XmlEncElementUrl;
// Create an EncryptionMethod element so that the
// receiver knows which algorithm to use for decryption.
edElement.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncAES256Url);
// Encrypt the session key and add it to an EncryptedKey element.
EncryptedKey ek = new EncryptedKey();
byte\[\] encryptedKey = EncryptedXml.EncryptKey(sessionKey.Key, Alg, false);
ek.CipherData = new CipherData(encryptedKey);
ek.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncRSA15Url);
// Set the KeyInfo element to specify the
// name of the RSA key.
// Create a new KeyInfo element.
edElement.KeyInfo = new KeyInfo();
// Create a new KeyInfoName element.
KeyInfoName kin = new KeyInfoName();
// Specify a name for the key.
kin.Value = KeyName;
// Add the KeyInfoName element to the
// EncryptedKey object.
ek.KeyInfo.AddClause(kin);
// Add the encrypted key to the
// EncryptedData object.
edElement.KeyInfo.AddClause(new KeyInfoEncryptedKey(ek));
// Add the encrypted element data to the
// EncryptedData object.
edElement.CipherData.CipherValue = encryptedElement;
////////////////////////////////////////////////////
// Replace the element from the original XmlDocument
// object with the EncryptedData element.
////////////////////////////////////////////////////
EncryptedXml.ReplaceElement(elementToEncrypt, edElement, false);
}
//xml解密
public static void Decrypt(XmlDocument Doc, RSA Alg, string KeyName)
{
// Check the arguments.
if (Doc == null)
throw new ArgumentNullException("Doc");
if (Alg == null)
throw new ArgumentNullException("Alg");
if (KeyName == null)
throw new ArgumentNullException("KeyName");
// Create a new EncryptedXml object.
EncryptedXml exml = new EncryptedXml(Doc);
// Add a key-name mapping.
// This method can only decrypt documents
// that present the specified key name.
exml.AddKeyNameMapping(KeyName, Alg);
// Decrypt the element.
exml.DecryptDocument();
}
#endregion
手机扫一扫
移动阅读更方便
你可能感兴趣的文章