C# 简单字节加密不起作用

C# 简单字节加密不起作用,c#,encryption,C#,Encryption,解密消息时,字符比原始字符少一个。例:H将是G 我试着通过打印值来调试代码,一切都很顺利,直到尝试除以100000并乘以日期 以下是我使用的代码: 我这里没有包括主要的方法 public static string encrypt(string input) { string final; string date = DateTime.Now.Date.ToShortDateString().ToString(); var da

解密消息时,字符比原始字符少一个。例: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;
    }
公共静态字符串加密(字符串输入)
{
弦乐决赛;
字符串日期=DateTime.Now.date.ToSortDateString().ToString();
var datetime=int.Parse(date.Replace(“/”,“”));
List=newlist();
var bytes=Encoding.UTF8.GetBytes(input.tocharray());
for(int i=0;i
可能是整数除法的舍入错误。在进行整数运算时,很可能
((x*日期/100000)*100000/日期)!=x
,事实上唯一的时间是
==x
是在
日期%100000==0

修复整数除法引入的舍入错误,它将修复您的问题



p.S.我也很犹豫是否将此称为“加密”,因为没有密钥,解密消息所需的所有信息都在消息本身中。你只需要依赖这样一个事实:算法是秘密的,这在C#中几乎是不可能做到的。我更愿意将您正在做的事情称为“编码”,因为要解码正在编码的东西,您只需要知道算法。

很可能是整数除法的舍入错误。在进行整数运算时,很可能
((x*日期/100000)*100000/日期)!=x
,事实上唯一的时间是
==x
是在
日期%100000==0

修复整数除法引入的舍入错误,它将修复您的问题



p.S.我也很犹豫是否将此称为“加密”,因为没有密钥,解密消息所需的所有信息都在消息本身中。你只需要依赖这样一个事实:算法是秘密的,这在C#中几乎是不可能做到的。我更愿意将您正在做的事情称为“编码”,因为要解码正在编码的东西,您只需要知道算法。

您正在使用低精度数据类型
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;
    }
公共静态字符串加密(字符串输入)
{
弦乐决赛;
字符串日期=DateTime.Now.date.ToString(“MMddyyyy”);
var datetime=int.Parse(日期);
List=newlist();
var bytes=Encoding.UTF8.GetBytes(输入);
for(int i=0;i

这是一个完全工作的控制台应用程序

您正在使用低精度数据类型
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;
    }
公共静态字符串加密(字符串输入)
{
弦乐决赛;
字符串日期=DateTime.Now.date.ToString(“MMddyyyy”);
var datetime=int.Parse(日期);
List=newlist();
var bytes=Encoding.UTF8.GetBytes(输入);
for(int i=0;i