首页 > 编程语言 >C#-XML文件及字符串的加密解密代码

C#-XML文件及字符串的加密解密代码

时间:2023-01-08 18:00:23浏览次数:35  
标签:XML string C# doc 解密 element new EncryptedXml method

先看XML文件的加解密,例如在桌面有个Student.xml文档,包含学生信息,需进行加密处理:

开始代码,添加命名空间引用:

using System.Security.Cryptography;
using System.Security.Cryptography.Xml;

建立一个静态类,并声明变量:

const string path = @"C:\Users\HKL\Desktop\Student.xml";//文件路径
static XmlDocument doc;
static XMLEncypt()
{
     doc = new XmlDocument();
}

编写创建算法函数,用以解加密:  

        /// <summary>
        /// 返回加密算法及类型
        /// </summary>
        /// <param name="method"></param>
        /// <returns></returns>
        static SymmetricAlgorithm Create(out string method)
        {
            RijndaelManaged TDESKey = new RijndaelManaged();
            TDESKey.Key = Encoding.Unicode.GetBytes("0123456789012345");
            TDESKey.Mode = CipherMode.ECB;
            TDESKey.Padding = PaddingMode.PKCS7;
            switch (TDESKey.KeySize)
            {
                case 128: method = EncryptedXml.XmlEncAES128Url; break;
                case 256: method = EncryptedXml.XmlEncAES256Url; break;
                case 192: method = EncryptedXml.XmlEncAES192Url; break;
                default: method = EncryptedXml.XmlEncAES128Url; break;
            }
            return TDESKey;
        }
View Code

文件加密方法:

 1         public static void Encrypt()
 2         {
 3             doc.Load(path);
 4             XmlElement element = (doc.FirstChild is XmlDeclaration ? doc.FirstChild.NextSibling : doc.FirstChild) as XmlElement;
 5             if (element == null || element.Name == "EncryptedData")
 6                 return;
 7             EncryptedXml eXML = new EncryptedXml(doc);
 8             string method;
 9             byte[] outPut = eXML.EncryptData(element, Create(out method), false);
10             EncryptedData eData = new EncryptedData()
11             {
12                 Type = EncryptedXml.XmlEncElementUrl,
13                 EncryptionMethod = new EncryptionMethod(method),
14                 CipherData = new CipherData()
15                 {
16                     CipherValue = outPut,
17                 }
18             };
19             EncryptedXml.ReplaceElement(element, eData, false);
20             doc.Save(path);
21         }
Encrypt()

文件解密方法:

 1         public static void Decrypt()
 2         {
 3             doc.Load(path);
 4             XmlElement element = doc.GetElementsByTagName("EncryptedData")[0] as XmlElement;
 5             if (element == null)
 6                 return;
 7             EncryptedData eData = new EncryptedData();
 8             eData.LoadXml(element);
 9             EncryptedXml eXML = new EncryptedXml();
10             string method;
11             byte[] outPut = eXML.DecryptData(eData, Create(out method));
12             eXML.ReplaceData(element, outPut);
13             doc.Save(path);
14         }
Decrypt()

*若只是读取加密文件,不对文件进行修改,则解密函数中不要执行doc.Save(path)即可;

*若要对加密文件进行修改,需先Load文件->解密内容->修改内容->加密内容->保存;

*若新增加密文件,先新增文件,再对文件进行加密。

        public static void Modify()
        {
            //*****************************************解密
            doc.Load(path);
            XmlElement element = doc.GetElementsByTagName("EncryptedData")[0] as XmlElement;
            if (element == null)
                return;
            EncryptedData eData = new EncryptedData();
            eData.LoadXml(element);
            EncryptedXml eXML = new EncryptedXml();
            string method;
            byte[] outPut = eXML.DecryptData(eData, Create(out method));
            eXML.ReplaceData(element, outPut);
            //******************************************修改
            XmlNodeList nodes = doc.SelectNodes("Students/Student");
            foreach (XmlNode node in nodes)
            {
                foreach (XmlAttribute attr in node.Attributes)
                {
                    if (attr.Name == "Age")
                        attr.Value = (Convert.ToSingle(attr.Value) + 1).ToString();
                }
            }
            //*****************************************加密
            element = (doc.FirstChild is XmlDeclaration ? doc.FirstChild.NextSibling : doc.FirstChild) as XmlElement;
            if (element == null || element.Name == "EncryptedData")
                return;
            eXML = new EncryptedXml(doc);
            outPut = eXML.EncryptData(element, Create(out method), false);
            eData = new EncryptedData()
            {
                Type = EncryptedXml.XmlEncElementUrl,
                EncryptionMethod = new EncryptionMethod(method),
                CipherData = new CipherData()
                {
                    CipherValue = outPut,
                }
            };
            EncryptedXml.ReplaceElement(element, eData, false);
            doc.Save(path);
        }
Modify()

效果:

下面记录字符串文本的加解密功能,ReadStr函数将txt文件中文本读出:

        static string ReadStr()
        {
            sr = new StreamReader(path);
            StringBuilder sb = new StringBuilder();
            while (true)
            {
                string str = sr.ReadLine();
                if (str == null)
                    break;
                sb.Append(str + "\r\n");
            }
            sr.Close();
            return sb.ToString();
        }
ReadStr()

加密解密方法:

 1         public static void Encrypt()//加密
 2         {
 3             string val = ReadStr();
 4             ICryptoTransform crypt = Create().CreateEncryptor();
 5             byte[] old = Encoding.Default.GetBytes(val);
 6             byte[] cur = crypt.TransformFinalBlock(old, 0, old.Length);
 7             string curStr = Convert.ToBase64String(cur);
 8             sw = new StreamWriter(path, false);
 9             sw.Write(curStr);
10             sw.Close();
11         }
Encrypt()
 1         public static void Decrypt()//解密
 2         {
 3             string val = ReadStr();
 4             ICryptoTransform crypt = Create().CreateDecryptor();
 5             byte[] old = Convert.FromBase64String(val);
 6             byte[] cur = crypt.TransformFinalBlock(old, 0, old.Length);
 7             string curStr = Encoding.Default.GetString(cur);
 8             sw = new StreamWriter(path, false);
 9             sw.Write(curStr);
10             sw.Close();
11         }
Decrypt()

 

标签:XML,string,C#,doc,解密,element,new,EncryptedXml,method
From: https://www.cnblogs.com/cfsl/p/17035000.html

相关文章

  • C语言学习--常量指针与指针常量
    指针常量#include<stdio.h>#include<string.h>//常量指针:是一个指针,定义不用初始化,能改变指向,但是指向的内容不能被修改constint*p;//指针常量:是一个常量,这......
  • Java中Elasticsearch 实现分页方式(三种方式)
    目录ES简介ES的特点:一、from+size浅分页二、scroll深分页scroll删除三、search_after深分页ES简介Elasticsearch是一个基于Lucene实现的......
  • Spring Cache
    SpringCache1、SpringCache介绍SpringCache是一个框架,实现了基于注解的缓存功能,只需要简单的加一个注解,就能实现缓存功能。SpringCache提供一层抽象,底层可以切换......
  • P10_组件-text和rich-text组件的基本用法
    常用的基础内容组件text文本组件类似于HTML中的span标签,是一个行内元素rich-text富文本组件支持把HTML字符串渲染为WXML结构text组件的基本使用......
  • w3cschool的htmlcss知识
      <!DOCTYPEhtml><html><head><style>.dropbtn{background-color:#4CAF50;color:rgb(212,91,91);pa......
  • C语言学习--指针函数与函数指针
       #include<stdio.h>#include<string.h>//指针函数:是一个函数,但是这个函数的返回值类型是一个指针//函数指针:是一个指针,这个指针的指向是一个函数//下面......
  • P8_组件-view和scroll-view组件的基本用法
    组件小程序中组件的分类小程序中的组件也是由宿主环境提供的,开发者可以基于组件快速搭建出漂亮的页面结构。官方把小程序的组件分为了9大类,分别是:视图容器基础内容......
  • docker实战: vue+java+uniapp部署到阿里云服务器详解(此文没有使用宝塔面板部署),附带各种
    一、部署前准备工具以及注意事项:项目来源:https://gitee.com/ZhongBangKeJi/crmeb_java?_from=gitee_search官方部署文档:https://doc.crmeb.com/java/crmeb_java1.ide:ide......
  • P10_组件-text和rich-text组件的基本用法
    常用的基础内容组件text文本组件类似于HTML中的span标签,是一个行内元素rich-text富文本组件支持把HTML字符串渲染为WXML结构text组件的基本使用......
  • synchronized详解
    一、synchronized使用1、synchronized的作用synchronized的作用主要有三:(1)、原子性:所谓原子性就是指一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素......