解密邮件时,字符比原始字符少一个。示例: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;
}
答案 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);
}
另外,作为旁注,为什么要创建自己的加密算法?你能否使用已经存在的?