如何对MD5哈希进行异或并返回32个字符的字符串?

时间:2017-02-28 22:17:42

标签: c#

如何通过使用可变大小(不超过32个字符)的字符串进行异或来进一步加密MD5哈希?

我希望XOR的结果也是32个字符的字符串。

到目前为止,我所尝试的是:

  • 将md5字​​符串转换为二进制
  • 将第二个字符串转换为二进制
  • 将第二个二进制数填充为0(向左),直到两个二进制文件的长度相等
  • 迭代二进制表示并对它们进行异或
  • 将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();

    }
}

1 个答案:

答案 0 :(得分:2)

使用基本上随机字节的字符串xoring不能保证为您提供有效的字符串作为输出。您的var text = Encoding.ASCII.GetString(data);可能会失败,因为您以字节形式传递了一个无效的字符串。您必须使用var text = Convert.ToBase64String(data)之类的内容来表示随机数据,而不会丢失过程中的信息。