-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