简单的字节加密不起作用

时间:2016-06-10 21:30:05

标签: c# encryption

解密邮件时,字符比原始字符少一个。示例:H将是G

我试图通过打印输出值来调试代码,一切顺利,直到尝试除以100000并乘以日期

以下是我使用的代码: 我没有在这里包括主要方法

    public static string encrypt(string input)
    {
        string final;

        string date = DateTime.Now.Date.ToShortDateString().ToString();

        var datetime = int.Parse(date.Replace("/", ""));
        List<int> semi = new List<int>();
        var bytes = Encoding.UTF8.GetBytes(input.ToCharArray());
        for (int i = 0; i < bytes.Length; i++)
        {
            int y = bytes[i] * datetime / 100000;
            semi.Add(y);
            Console.WriteLine(y);
        }

        Console.WriteLine(string.Join("", bytes));

        final = string.Join(":", semi.ToArray()) + ":" + date;
        return final;
    }


    public static string decrypt(string input)
    {
        string final;
        string[] raw = input.Split(':');

        int date = int.Parse(raw[raw.Length - 1].Replace("/",""));
        var dump = new List<string>(raw);

        dump.RemoveAt(raw.Length - 1);
        string[] stringbytes = dump.ToArray();


        List<byte> bytes = new List<byte>();

        for (int i = 0; i < stringbytes.Length; i++)
        {
            int x = int.Parse(stringbytes[i]);
            Console.WriteLine(x);

            x = x * 100000 / date;
            byte finalbytes = Convert.ToByte(x);
            bytes.Add(finalbytes);

        }
        Console.WriteLine(string.Join("", bytes.ToArray()));
        Console.WriteLine(date);
        var bytearray = bytes.ToArray();
        final = Encoding.UTF8.GetString(bytearray);

        return final;
    }

3 个答案:

答案 0 :(得分:2)

它可能是整数除法的舍入误差。在进行整数数学时,很有可能是((x * date / 100000) * 100000 / date) != x,实际上== x的唯一时间是date % 100000 == 0

修复你的int部门引入的舍入错误,它应该可以解决你的问题。

P.S。我也会非常犹豫地称这个&#34;加密&#34;,没有密钥,拒绝消息所需的所有信息都在消息本身中。您只依赖于算法是秘密的事实,这对C#几乎是不可能的。我宁愿打电话给你正在做的事情&#34;编码&#34;,因为解码所有你需要知道的东西就是算法。

答案 1 :(得分:0)

您正在使用低精度数据类型int来存储除法的结果。我已将类型更改为double并且可以正常工作

    public static string encrypt(string input)
    {
        string final;

        string date = DateTime.Now.Date.ToString("MMddyyyy");

        var datetime = int.Parse(date);
        List<double> semi = new List<double>();
        var bytes = Encoding.UTF8.GetBytes(input);
        for (int i = 0; i < bytes.Length; i++)
        {
            double y = bytes[i] * datetime / 100000;
            semi.Add(y);
            Console.WriteLine(y);
        }

        Console.WriteLine(string.Join("", bytes));

        final = string.Join(":", semi.ToArray()) + ":" + date;
        return final;
    }


    public static string decrypt(string input)
    {
        string final;
        string[] raw = input.Split(':');

        int date = int.Parse(raw[raw.Length - 1].Replace("/", ""));
        var dump = new List<string>(raw);

        dump.RemoveAt(raw.Length - 1);
        string[] stringbytes = dump.ToArray();


        List<byte> bytes = new List<byte>();

        for (int i = 0; i < stringbytes.Length; i++)
        {
            var x = double.Parse(stringbytes[i]);
            Console.WriteLine(x);

            x = x * 100000 / date;
            byte finalbytes = Convert.ToByte(x);
            bytes.Add(finalbytes);

        }
        Console.WriteLine(string.Join("", bytes.ToArray()));
        Console.WriteLine(date);
        var bytearray = bytes.ToArray();
        final = Encoding.UTF8.GetString(bytearray);

        return final;
    }

这是一个完全正常运行的控制台应用http://ideone.com/Rjc13A

答案 2 :(得分:0)

我认为这是一个数字截断问题。在你的decrypt方法中,除法实际上会创建一个double而不是int - 如果你进行数学运算,结果会得到小数位。由于x是一个整数,它将被截断。

以下内容应该有效:

  for (int i = 0; i < stringbytes.Length; i++)
  {
            var x = double.Parse(stringbytes[i]);
            Console.WriteLine(x);

            x = Math.Round((x * 100000) / date,0);
            byte finalbytes = Convert.ToByte(x);
            bytes.Add(finalbytes);

  }

另外,作为旁注,为什么要创建自己的加密算法?你能否使用已经存在的?