最近没事看了一个朋友写的用C#加密中文的小算法,他让我尝试去写他的加密算法,他把解密算法给我看了下,可不知道怎么下手,对于位运算不熟悉,特此来请教一下,这个小算法为了保护程序中的中文被恶意修改,把代码贴出来大家看看
两个参数,第一个参数为加密的中文字符串,第二个为一个int类型的数值,算法中要根据这个数值去解密,类似KEY,但是简化了而已,高手帮忙看看下,另外给个例子,例如:"笹" 解密就可以得到 "提示"这中文 private string a(string arg1, int arg2)
{
            char[] array = arg1.ToCharArray();
            int num = 2031709749 + arg2;
            int i = 0;
            while (i < array.Length)
            {
                byte b1 = (byte)((int)(array[i] & 'ÿ') ^ num++);
                byte b2 = (byte)((int)((int)array[i] >> 8) ^ num++);
                byte temp = b2;                
                b2 = b1;
                b1 = temp;
                array[i] = (char)((int)b2 << 8 | b1);
                i++;
            }
            return string.Intern(new string(array));
}

解决方案 »

  1.   

    初步看到这个函数,有一个常量数值2031709749,第一想到的应该是中文的编码之类的东西,只是不知道其原理是怎么计算出着两个参数b1和b2,而且这两个参数(b2 << 8 | b1)刚好得到这个中文字符
      

  2.   

    调整一下位置就可以。只有xor运算是核心。private static string decrypt(string arg1,int arg2)
    {
    char[] array = arg1.ToCharArray();
    int num = 2031709749 + arg2;
            int i = 0;
    while (i < array.Length)
    {
    byte b1 = (byte)((int)(array[i] & 'ÿ'));
    byte b2 = (byte)((int)((int)array[i] >> 8));
    byte temp = b2;                
    b2 = b1;
    b1 = temp;
    b1 = (byte)(b1 ^ num++);
    b2 = (byte)(b2 ^ num++);
    array[i] = (char)((int)b2 << 8 | b1);
    i++;
    }
    return string.Intern(new string(array));
    }
      

  3.   

    注释;加密改了个名字好看懂点private static string encrypt(string arg1, int arg2)
    {
    char[] array = arg1.ToCharArray();
    int num = 2031709749 + arg2;
    int i = 0;
    while (i < array.Length)
    {
    byte b1 = (byte)((int)(array[i] & 'ÿ') ^ num++);//‘ÿ’=0xFF,这里是取低8位进行异或运算。
    byte b2 = (byte)((int)((int)array[i] >> 8) ^ num++);//转int,右移8位,即取高8位进行运算。
    byte temp = b2;                
    b2 = b1;
    b1 = temp;
    //交换高低位
    array[i] = (char)((int)b2 << 8 | b1);//组合高低位
    i++;
    }
    return string.Intern(new string(array));
    }
    private static string decrypt(string arg1,int arg2)
    {
        char[] array = arg1.ToCharArray();
        int num = 2031709749 + arg2;
            int i = 0;
        while (i < array.Length)
        {
            byte b1 = (byte)((int)(array[i] & 'ÿ'));//取出低8位
            byte b2 = (byte)((int)((int)array[i] >> 8));//取出高8位
            byte temp = b2;                
            b2 = b1;
            b1 = temp;
            //交换高低位
            b1 = (byte)(b1 ^ num++);//低8位先进行异或
            b2 = (byte)(b2 ^ num++);//高8位进行异或
            array[i] = (char)((int)b2 << 8 | b1);//组合高低位
            i++;
        }
        return string.Intern(new string(array));
    }