专业编程基础技术教程

网站首页 > 基础教程 正文

C#通过二进制读写实现文件的伪加密

ccvgpt 2024-12-02 15:43:29 基础教程 2 ℃

快速加密的思路

此方法不算是真正的加密,只是可以防止别人打开使用你的文件,一般而言对于加密来说,加密的速度取决于文件的大小,加密的安全性取决于采用哪种加密算法,例如一个1G的文件不论是采用RSA加密还是AES加密,都不会速度快,你要先分段读取文件,然后加密段,然后再保存成文件,解密的时候也是同样的操作,时间上花费很大。

防止一般人读取你的文件,我们可以换个思路,就是通过二进制的方式读取文件,首先跳过文件开头的10个字节,这10个字节是文件类型、版本之类的,然后从第10个字节开始读取,不论是你读取128个字节还是256个字节,都是非常速度的,本来想着把读取出来的字节使用AES进行加密,再替换掉后保存,后来发现明文和密文的长度不一样长,无法快速的实现把比明文长的一段数据插入到二进制文件中,所以想要对文件中的部分内容进行加密就放弃了。

C#通过二进制读写实现文件的伪加密

那就直接来个简单粗暴的方法,例如从第10个字节开始读取256个字节,然后把字节按位取反,再把取反的结果从第10个字节写入,这样长度是一致的,但是内容不致了,从而实现了不解密就无法打开文件,当然了,古典密码中例如希尔密码,就可以实现明文和密文一样长,但对于高手来说,古典密码和按位取反没啥区别[捂脸],但防止普通人是足够用了。

二进制读取和写入

//二进制文件读取 
public static byte[] BitFile(string path) 
 {
     long startPosition = 10; // 从文件的哪个位置开始读取,这里以10为例
     long length = 256; // 需要读取的字节数
     string res = "";
     byte[] bytes;
     // 打开文件流
     using (FileStream fileStream = new FileStream(path, FileMode.Open))
     {
         // 设置文件流的起始位置
         fileStream.Seek(startPosition, SeekOrigin.Begin);

         // 创建二进制读取器
         using (BinaryReader binaryReader = new BinaryReader(fileStream))
         {
             // 读取指定长度的二进制数据
             bytes = binaryReader.ReadBytes((int)length);
          }
     }
     return bytes;
 }

//二进制文件写入
 public static void WriteFile(string path, byte[] data)
 {
     long startPosition = 10; // 从文件的哪个位置开始读取,这里以10为例
     using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Write))
     {
         // 将文件指针移动到指定位置
         fileStream.Seek(startPosition, SeekOrigin.Begin);
         
         // 将数据写入文件
         fileStream.Write(data, 0, data.Length);
         fileStream.Close();
         
     }
 }

//byte[]按位取反
 public static byte[] InvertBytes(byte[] bytes)
 {
     return bytes.Select(b => (byte)~b).ToArray();
 }

读取和写入操作,由于读取和写入的字节数长度一致,写1m和写1G的没有区别

 string mes = "";
 string path = "D:\\11.mp4";
 byte[] data = null;

//读取,查看读出来的数据
 data = DB.BitFile(path);
 mes =BitConverter.ToString(data);
 listBox1.Items.Add(mes);

//按位取反,写入数据
 byte[] d1 = InvertBytes(data);
 DB.WriteFile(path, d1);

//再次读取,查看是否写入成功
 data = DB.BitFile(path);
 mes = BitConverter.ToString(data);
 listBox1.Items.Add(mes);

效果

Tags:

最近发表
标签列表