9.二进制数据加密

9.CSharp类对象相关-二进制数据加密


9.1 知识点

何时加密?何时解密?

  • 当我们将类对象转换为二进制数据时进行加密。

  • 当我们将二进制数据转换为类对象时进行解密。

  • 这样如果第三方获取到我们的二进制数据,当他们不知道加密规则和解密秘钥时就无法获取正确的数据,起到保证数据安全的作用。

加密是否是100%安全?

  • 一定记住加密只是提高破解门槛,没有100%保密的数据。
  • 通过各种尝试始终是可以破解加密规则的,只是时间问题。
  • 加密只能起到提升一定的安全性。

常用加密算法

  • MD5算法

  • SHA1算法

  • HMAC算法

  • AES/DES/3DES算法

  • 等等等

    有很多的别人写好的第三发加密算法库,可以直接获取用于在程序中对数据进行加密。这里我们不深究,感兴趣的同学可以自己去了解。

用简单的异或加密感受加密的作用

注意:两次异或操作会使得原始值恢复

// 创建一个名为person1的Person对象实例
Person person1 = new Person();

// 定义一个名为key的byte变量,并赋值为199
byte key = 199;

// 使用using语句块创建一个名为memoryStream的MemoryStream对象实例
using (MemoryStream memoryStream = new MemoryStream())
{
    // 创建一个BinaryFormatter对象实例
    BinaryFormatter binaryFormatter = new BinaryFormatter();

    // 将person1对象序列化到memoryStream中
    binaryFormatter.Serialize(memoryStream, person1);

    // 获取memoryStream中的字节数组
    byte[] bytes = memoryStream.GetBuffer();

    // 对字节数组进行异或加密
    for (int i = 0; i < bytes.Length; i++)
    {
        bytes[i] ^= key;
    }

    // 将加密后的字节数组写入文件
    File.WriteAllBytes(Application.dataPath + "/Lesson09_CSharp类对象相关_二进制数据加密.linwentao", bytes);
}

// 解密
// 从文件中读取字节数组
byte[] bytes2 = File.ReadAllBytes(Application.dataPath + "/Lesson09_CSharp类对象相关_二进制数据加密.linwentao");

// 对字节数组进行异或解密
for (int i = 0; i < bytes2.Length; i++)
{
    bytes2[i] ^= key;
}

// 使用using语句块创建一个名为memoryStream的MemoryStream对象实例,并传入解密后的字节数组
using (MemoryStream memoryStream = new MemoryStream(bytes2))
{
    // 创建一个BinaryFormatter对象实例
    BinaryFormatter binaryFormatter = new BinaryFormatter();

    // 从memoryStream中反序列化出一个Person对象,并将其赋值给person2变量
    Person person2 = binaryFormatter.Deserialize(memoryStream) as Person;

    // 关闭memoryStream
    memoryStream.Close();
}

9.2 知识点代码

using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEngine;

public class Lesson09_CSharp类对象相关_二进制数据加密 : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 何时加密?何时解密?

        //当我们将类对象转换为2进制数据时进行加密
        //当我们将2进制数据转换为类对象时进行解密

        //这样如果第三方获取到我们的2进制数据
        //当他们不知道加密规则和解密秘钥时就无法获取正确的数据
        //起到保证数据安全的作用

        #endregion

        #region 知识点二 加密是否是100%安全?

        //一定记住加密只是提高破解门槛,没有100%保密的数据
        //通过各种尝试始终是可以破解加密规则的,只是时间问题
        //加密只能起到提升一定的安全性

        #endregion

        #region 知识点三 常用加密算法

        //MD5算法
        //SHA1算法
        //HMAC算法
        //AES/DES/3DES算法
        //等等等

        //有很多的别人写好的第三发加密算法库
        //可以直接获取用于在程序中对数据进行加密
        //这里我们不深究 感兴趣的同学可以自己去了解

        #endregion

        #region 知识点四 用简单的异或加密感受加密的作用

        // 创建一个名为person1的Person对象实例
        Person person1 = new Person();

        // 定义一个名为key的byte变量,并赋值为199
        byte key = 199;

        // 使用using语句块创建一个名为memoryStream的MemoryStream对象实例
        using (MemoryStream memoryStream = new MemoryStream())
        {
            // 创建一个BinaryFormatter对象实例
            BinaryFormatter binaryFormatter = new BinaryFormatter();

            // 将person1对象序列化到memoryStream中
            binaryFormatter.Serialize(memoryStream, person1);

            // 获取memoryStream中的字节数组
            byte[] bytes = memoryStream.GetBuffer();

            // 对字节数组进行异或加密
            for (int i = 0; i < bytes.Length; i++)
            {
                bytes[i] ^= key;
            }

            // 将加密后的字节数组写入文件
            File.WriteAllBytes(Application.dataPath + "/Lesson09_CSharp类对象相关_二进制数据加密.linwentao", bytes);
        }

        // 解密
        // 从文件中读取字节数组
        byte[] bytes2 = File.ReadAllBytes(Application.dataPath + "/Lesson09_CSharp类对象相关_二进制数据加密.linwentao");

        // 对字节数组进行异或解密
        for (int i = 0; i < bytes2.Length; i++)
        {
            bytes2[i] ^= key;
        }

        // 使用using语句块创建一个名为memoryStream的MemoryStream对象实例,并传入解密后的字节数组
        using (MemoryStream memoryStream = new MemoryStream(bytes2))
        {
            // 创建一个BinaryFormatter对象实例
            BinaryFormatter binaryFormatter = new BinaryFormatter();

            // 从memoryStream中反序列化出一个Person对象,并将其赋值给person2变量
            Person person2 = binaryFormatter.Deserialize(memoryStream) as Person;

            // 关闭memoryStream
            memoryStream.Close();
        }

        #endregion
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏