2017-02-28 39 views
-1

如何通過用可變大小的字符串(不超過32個字符)異或來進一步加密MD5哈希?如何異或MD5散列並返回32個字符的字符串?

我想XOR的結果也是一個32個字符的字符串。

我有什麼到目前爲止已經試過是:

  • 的MD5串第二個字符串轉換爲二進制
  • 轉換爲二進制
  • 墊第二個二進制0的(左側),直到兩個二進制文件的長度相等
  • 迭代的二進制表示和XOR他們
  • 的XOR運算結果轉換爲字符串

該方法可能是錯誤的,我不知道該怎麼做。我的問題是,在轉換XOR的結果時,它不是一個32個字符的字符串,因爲我希望它是。

示例代碼(在這種情況下,相同長度的字符串):

class Program 
{ 
    static void Main(string[] args) 
    { 

     var md51 = ToBinary(ConvertToByteArray(CalculateMD5Hash("Maaa"), Encoding.ASCII)); 
     var md52 = ToBinary(ConvertToByteArray(CalculateMD5Hash("Moo"), Encoding.ASCII)); 

     List<int> xoredResult = new List<int>(); 

     for (int i = 0; i < md51.Length; i++) 
     { 
      var string1 = md51[i]; 
      var string2 = md52[i]; 
      var xor = string1^string2; 
      xoredResult.Add(xor); 
     } 

     var resultingString = string.Join("", xoredResult); 
     Console.WriteLine(resultingString.Length); 

     var data = GetBytesFromBinaryString(resultingString); 
     var text = Encoding.ASCII.GetString(data); 

    } 

    public static byte[] ConvertToByteArray(string str, Encoding encoding) 
    { 
     return encoding.GetBytes(str); 
    } 

    public static String ToBinary(Byte[] data) 
    { 
     return string.Join("", data.Select(byt => Convert.ToString(byt, 2).PadLeft(8, '0'))); 
    } 

    public static Byte[] GetBytesFromBinaryString(String binary) 
    { 
     var list = new List<Byte>(); 

     for (int i = 0; i < binary.Length; i += 8) 
     { 
      String t = binary.Substring(i, 8); 

      list.Add(Convert.ToByte(t, 2)); 
     } 

     return list.ToArray(); 
    } 

    public static string CalculateMD5Hash(string input) 
    { 

     // step 1, calculate MD5 hash from input 

     MD5 md5 = System.Security.Cryptography.MD5.Create(); 

     byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input); 

     byte[] hash = md5.ComputeHash(inputBytes); 

     // step 2, convert byte array to hex string 

     StringBuilder sb = new StringBuilder(); 

     for (int i = 0; i < hash.Length; i++) 

     { 

      sb.Append(hash[i].ToString("X2")); 

     } 

     return sb.ToString(); 

    } 
} 
+3

我很困惑和頭暈,你在字符串和字節之間回溯和前後多少次...... –

+0

我同意馬克,雖然我發佈的答案可能會解決你的主要潛在問題,你真的應該停止將所有內容轉換爲字符串並返回,並且只需像'CalculateMD5Hash'這樣的函數返回保存在'hash'變量中的'byte []'。 –

+2

真正的問題是,爲什麼要異或MD5。 「進一步加密」沒有意義。 MD5已經是一個不可逆轉的散列函數。異或是一種容易可逆的混淆。你想添加什麼價值? – Tim

回答

2

XOR運算什麼是隨機字節的字符串是不能保證給你一個有效的字符串作爲輸出。您的var text = Encoding.ASCII.GetString(data);可能會失敗,因爲您以字節形式將它傳遞給無效字符串。您必須使用類似var text = Convert.ToBase64String(data)這樣的東西來表示隨機數據,而不會丟失過程中的信息。

相關問題