2017-02-28 123 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)这样的东西来表示随机数据,而不会丢失过程中的信息。