-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();
}
}
我很困惑和头晕,你在字符串和字节之间回溯和前后多少次...... –
我同意马克,虽然我发布的答案可能会解决你的主要潜在问题,你真的应该停止将所有内容转换为字符串并返回,并且只需像'CalculateMD5Hash'这样的函数返回保存在'hash'变量中的'byte []'。 –
真正的问题是,为什么要异或MD5。 “进一步加密”没有意义。 MD5已经是一个不可逆转的散列函数。异或是一种容易可逆的混淆。你想添加什么价值? – Tim