C# 如何给XML文件加密

塔克茜丝 2020-05-21 06:58:41
本人小白,用xml来保存一些信息,想把这个xml文件加密起来。
只有通过程序才能访问,直接打开是打不开的或者是乱码。
请高手给点详细的代码和解释
...全文
1600 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
丁劲犇 2020-05-29
  • 打赏
  • 举报
回复
这个,自己产生一串随机数,而后xor上去就乱码了吧。想变回来,再xor一次
塔克茜丝 2020-05-26
  • 打赏
  • 举报
回复
这个贴主题有点大了,多谢各位给我的这些信息,结贴给分。
后面我会学习下之后,按照小的题目重新发帖,谢谢给位
yujidang8706 2020-05-25
  • 打赏
  • 举报
回复
这个问题比较复杂~~~~~
塔克茜丝 2020-05-24
  • 打赏
  • 举报
回复
引用 19 楼 jhonsonzhang 的回复:
加密的算法,到现在为止,所有语言都没有脱离密文密匙这个框框,所以楼主没必要去找什么现成的,不如自己留点心思,了解下密文密匙,写个自己的,可以用到这种加密方法废止为止。字符串也好,文件流也好,用之四海皆准。

有入门的最基础的链接可以分享么?谢谢
塔克茜丝 2020-05-23
  • 打赏
  • 举报
回复
我一共有3个xml文件,1种是放项目列表的只有1个xml文件,1个是放组员信息的,1个是放每个项目自己信息的。
这3个xml文件都共享在内部服务器上。方便不同组员分享,但是希望他们都是通过程序来访问,而不是直接外面打开乱编辑。
所以想把这个加密掉
塔克茜丝 2020-05-23
  • 打赏
  • 举报
回复
我加分了,想详细了解下。
我不是专业的软件工程师,是为了工作方便做个软件提高自己team的工作效率
塔克茜丝 2020-05-23
  • 打赏
  • 举报
回复

引用 9 楼 The 祺℡ 的回复:
首先搞清楚你是要对文件加密还是对数据加密。

如果是对文件加密,压根不想让别人打开自己的这个文件,或者打开之后看到的也是一串乱码。就可以考虑用二进制文件用于存储信息,读取和写入的时候做一次解析。


这个基本就可以满足我的需求了,我这个是内网
我用的是doc.load和save来读取,保存xml文件,二进制存储如何进行?
本人小白,这方便不是很懂。需要using什么
然后我看到doc.load有4个重载,是用stream流么?这部分是否能给点详细的描述,谢谢
desperaso 2020-05-23
  • 打赏
  • 举报
回复
这个问题只是字符串加密问题,百度下很多
desperaso 2020-05-23
  • 打赏
  • 举报
回复
对象序列化->xaml字符串->字符串加密,
使用时 :字符串解密->xaml字符串->反序列化到对象


using System.Runtime.Serialization.Json;
using System.IO;
using System.Xml.Serialization;
using System.Xml;
using System.Runtime.Serialization.Formatters.Binary;

public class Serializer
{
/// 将对象序列化为json文件
public static void ObjectToJson<T>(T t, string path) where T : class
{
DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(T));
using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate))
{
formatter.WriteObject(stream, t);
}
}

/// 将对象序列化为json字符串
public static string ObjectToJson<T>(T t) where T : class
{
DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(T));
using (MemoryStream stream = new MemoryStream())
{
formatter.WriteObject(stream, t);
string result = System.Text.Encoding.UTF8.GetString(stream.ToArray());
return result;
}
}

/// json字符串转成对象
public static T JsonToObject<T>(string json) where T : class
{
DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(T));
using (MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(json)))
{
T result = formatter.ReadObject(stream) as T;
return result;
}
}

/// 将对象序列化为xml文件
public static void ObjectToXml<T>(T t, string path) where T : class
{
XmlSerializer formatter = new XmlSerializer(typeof(T));
////using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate))
using (FileStream stream = new FileStream(path, FileMode.Create))
{
formatter.Serialize(stream, t);
}
}

/// 将对象序列化为xml字符串
public static string ObjectToXml<T>(T t) where T : class
{
XmlSerializer formatter = new XmlSerializer(typeof(T));
using (MemoryStream stream = new MemoryStream())
{
formatter.Serialize(stream, t);
string result = System.Text.Encoding.UTF8.GetString(stream.ToArray());
return result;
}
}

/// 将xml文件反序列化为对象
public static T XmlToObject<T>(T t, string path) where T : class
{
XmlSerializer formatter = new XmlSerializer(typeof(T));
using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate))
////using (FileStream stream = new FileStream(path, FileMode.Create))
{
XmlReader xmlReader = new XmlTextReader(stream);
T result = formatter.Deserialize(xmlReader) as T;
return result;
}
}

/// 将xml字符串反序列化为对象
public static T XmlStrToObject<T>(T t, string str) where T : class
{
XmlSerializer formatter = new XmlSerializer(typeof(T));

StringReader xmlReader = new StringReader(str);
T result = formatter.Deserialize(xmlReader) as T;
return result;
}


/// 将对象序列化为二进制流
public static byte[] ObjectToString<T>(T t)
{
BinaryFormatter formatter = new BinaryFormatter();
using (MemoryStream stream = new MemoryStream())
{
formatter.Serialize(stream, t);
byte[] result = stream.ToArray();
return result;
}
}

/// 将二进制流反序列为类型
public static T StringToObject<T>(byte[] bytes) where T : class
{
BinaryFormatter formatter = new BinaryFormatter();
using (MemoryStream stream = new MemoryStream(bytes, 0, bytes.Length))
{
T result = formatter.Deserialize(stream) as T;
return result;
}
}

/// 将对象序列化为文件
public static void ObjectToFile<T>(T t, string path)
{
BinaryFormatter formatter = new BinaryFormatter();
using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate))
{
formatter.Serialize(stream, t);
stream.Flush();
}
}

/// 将文件反序列化为对象
public static T FileToObject<T>(string path) where T : class
{
using (FileStream stream = new FileStream(path, FileMode.Open))
{
BinaryFormatter formatter = new BinaryFormatter();
T result = formatter.Deserialize(stream) as T;
return result;
}
}
}
jhonsonzhang 2020-05-23
  • 打赏
  • 举报
回复
加密的算法,到现在为止,所有语言都没有脱离密文密匙这个框框,所以楼主没必要去找什么现成的,不如自己留点心思,了解下密文密匙,写个自己的,可以用到这种加密方法废止为止。字符串也好,文件流也好,用之四海皆准。
  • 打赏
  • 举报
回复
无论给你讲的多么详细,你这方面知识欠缺的太多。这里面的问题还多得很。即使有人把你这个软件写出来,你还得在这基础上提新的需求或者不能满足你需求的问题。 就简单问你一个问题,多个人同时编辑提交并发怎么处理?
The 祺℡ 2020-05-22
  • 打赏
  • 举报
回复
1. 如果是对XML文件内容加密,在写入和读取的时候用BASE64转一次就行了,一般人看不懂。
   public static String strConvertBase(String str) {
        if(null != str){
            Base64.Encoder encoder = Base64.getEncoder();
            return encoder.encodeToString(str.getBytes());
        }
        return null;
    }
 
    public static String baseConvertStr(String str) {
        if(null != str){
            Base64.Decoder decoder = Base64.getDecoder();
            try {
                return new String(decoder.decode(str.getBytes()), "GBK");
            } catch (UnsupportedEncodingException e) {
                return null;
            }
        }
        return null;
    }
2. 如果想对文件加密,还不如用二进制来得干脆。
大然然 2020-05-22
  • 打赏
  • 举报
回复
xml文件加密还不如xml内容加密
杀马特丶蛮牛 2020-05-22
  • 打赏
  • 举报
回复
2种方式,一种是内容加密,一种是文件加密,
塔克茜丝 2020-05-22
  • 打赏
  • 举报
回复
引用 3 楼 失足成万古风流人物 的回复:
网上随便找个加解密算法。
实在不行,最简单,自己做个base64

小白啊,求链接
  • 打赏
  • 举报
回复
网上随便找个加解密算法。 实在不行,最简单,自己做个base64
塔克茜丝 2020-05-22
  • 打赏
  • 举报
回复
你好,这是加密xml元素的。对我来说,我的xml都很小。
我的想法是,用doc.load的时候,将加密的文件读取出来,然后在内存中解密掉,然后进行操作。
最后save的时候,用doc.save直接存储再次加密的文件。

加密文件-->内存-->解密-->修改-->加密-->存储到磁盘
The 祺℡ 2020-05-22
  • 打赏
  • 举报
回复
如果你只是单纯想保存程序关闭时的信息,用于下次打开的时候做初始化,还不想让别人知道里面的具体内容。考虑一下结构体吧。老兄~
The 祺℡ 2020-05-22
  • 打赏
  • 举报
回复
首先搞清楚你是要对文件加密还是对数据加密。 如果是对文件加密,压根不想让别人打开自己的这个文件,或者打开之后看到的也是一串乱码。就可以考虑用二进制文件用于存储信息,读取和写入的时候做一次解析。 如果只是想对xml节点内容加密,用base64编码再写入就好,读取的时候在从base64反编回来。不想每次读取加密,那就封装一个xmlHelper类。
塔克茜丝 2020-05-22
  • 打赏
  • 举报
回复
2. 如果想对文件加密,还不如用二进制来得干脆。
--这话怎么说?我这个是xml文件,要对里面数据进行读取的。
对内容逐个加密太累....
加载更多回复(1)

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧