数据加密一种最简单的加密方式是异或运算加密,可以用来简单的数据传输加密和文件,字符串等加密。
数学运算符为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;
}