简单的加密解密

数据加密一种最简单的加密方式是异或运算加密,可以用来简单的数据传输加密和文件,字符串等加密。

数学运算符为XOR(exclusive OR),在计算机中通常用"^"的符号表示(在英文模式下,按住shift键+键盘上方的数字6)
在二进制中:
1 ^ 0=1
0 ^ 1=1
1 ^ 1=0
0 ^ 0=0
可以看出若两个数相同取0,不同取1。
例:
运算11001 ^ 01011=10010
用其他进制表示的数做异或运算时,则应先将他们化为二进制的数,再做运算。(不足的位在前边填0补齐)
例:
计算6 ^ 3 = 110^011 = 101
异或运算具有可逆性。
即:若a ^ b = c,则有b ^ c = a (a,b,c分别表示0或1)
利用前面的异或运算规则,我们就其中之一分析:
1 ^ 0=1 则 0 ^ 1 = 1
原理:根据异或的运算规则,相同为0,不同为1;
这里引用自: https://www.cnblogs.com/albertblues/p/5670528.html

下面的脚本可以对字符串进行简单加密,这里注意编码:ISO-8859-1(0x00-0xFF)。这里需要单字符编码,如果用ASCII(0x00-0x7F)可能出现数据丢失。

using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;

public static class CChangeStr  {
    static byte jied(byte c)
    {
        return (byte)(((c ^ 175) - 66) ^ 216);
    }
    static byte jiad(byte c)
    {
        return (byte)(((c ^ 216) + 66) ^ 175);
    }

    public static string jja(string str)
    {
        byte[] msg = Encoding.GetEncoding("ISO-8859-1").GetBytes(str);
        int i;
        for (i = 0; i < msg.Length; i++)
        {
            msg[i] = (byte)jiad((byte)msg[i]);
        }
        string outStr = Encoding.GetEncoding("ISO-8859-1").GetString(msg);
        return outStr;
    }

    public static string jje(string str)
    {
        byte[] msg = Encoding.GetEncoding("ISO-8859-1").GetBytes(str);
        int i;
        for (i = 0; i < msg.Length; i++)
        {
            msg[i] = (byte)jied((byte)msg[i]);
        }
        string outStr = Encoding.GetEncoding("ISO-8859-1").GetString(msg);
        return outStr;
    }
    
}


如果是中文的话,上面的GetEncoding(“ISO-8859-1”)得到的会被截断掉的数据,所以先转化成UTF8,再转换字符串,然后再次编码成ISO-8859-1,解码反着来一遍。这样就能加密所有的字符了。

public static string jja(string str)
    {
        //先取UTF8
        byte[] msg = Encoding.GetEncoding("UTF-8").GetBytes(str);
        //把UTF8转换成88591(中文的也就分解成了8859)
        str = Encoding.GetEncoding("ISO-8859-1").GetString(msg);
        //再把88591进行加密
        msg = Encoding.GetEncoding("ISO-8859-1").GetBytes(str);
        int i;
        for (i = 0; i < msg.Length; i++)
        {
            msg[i] = (byte)jiad((byte)msg[i]);
        }
        //把加密后的88591转换成字符串
        string outStr = Encoding.GetEncoding("ISO-8859-1").GetString(msg);
        return outStr;
    }

    //解密就是相反的过程
    public static string jje(string str)
    {
        //先把加密的字符串解码
        byte[] msg = Encoding.GetEncoding("ISO-8859-1").GetBytes(str);
        int i;
        for (i = 0; i < msg.Length; i++)
        {
            msg[i] = (byte)jied((byte)msg[i]);
        }
        //得到的是88591转码格式的
        string outStr = Encoding.GetEncoding("ISO-8859-1").GetString(msg);
        //需要再次解码成UTF8
        msg = Encoding.GetEncoding("ISO-8859-1").GetBytes(outStr);
        outStr = Encoding.GetEncoding("UTF-8").GetString(msg);
        return outStr;
    }

你可能感兴趣的:(Unity,C#)