2016-06-10 34 views
0

解密郵件時,字符比原始字符少一個。例如: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

'Encoding.UTF8.GetBytes(輸入);'不需要調用ToCharArray() – fahadash

+0

@fahadash我已刪除ToCharArray(),它有沒有變化 – silentcallz

回答

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

+0

我很驚訝它考慮到你仍然有'datetime/100000'的int分區正在進行。如果你做了'datetime/100000.0'就可以修復它 –

+0

@ScottChamberlain隨意編輯。 – fahadash

2

這可能是整數除法的舍入誤差。當做整數運算時,它很有可能是((x * date/100000) * 100000/date) != x,實際上只有當它是== x時是date % 100000 == 0

修復int分割引入的舍入錯誤,它應該修復你的問題。


P.S.我也會很猶豫稱這個「加密」,沒有密鑰,解密消息所需的所有信息都在消息本身。你只是依靠這個算法是祕密的這一事實,這對C#來說實際上是不可能的。我寧願打電話給你正在做的「編碼」,因爲要解碼所有你需要知道的是編碼的算法。

+0

更多類似「錯亂」比加密 – fahadash

0

我相信這是一個數字截斷問題。在你的解密方法中,這個部門實際上會創建一個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); 

    } 

此外,作爲一個側面說明爲什麼要創建自己的加密算法?你能不能使用已經存在的一個?

+0

我想嘗試新的東西並忘記了取整值。編程時我很生疏。 – silentcallz