2017-02-28 30 views
-1

MD5ハッシュを可変長の文字列(32文字以下)と排他的論理和(XOR)してさらに暗号化するにはどうすればよいですか?MD5ハッシュをXORして32文字の文字列を返す方法は?

私はXORの結果を32文字の文字列にしたいと思います。私がこれまで試してみました何

は次のとおりです。

  • が0の(左へ)の両方のバイナリがであるまでにバイナリ
  • パッド秒バイナリに変換し、バイナリ
  • に2番目の文字列をMD5文字列を変換します等しい長さ
  • バイナリ表現を反復し、
  • それらを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をXORしたいのですか? 「それをさらに暗号化する」は意味をなさない。 MD5は、すでに不可逆的なハッシュ関数です。 XORは簡単に可逆的な難読化です。どのような価値を追加しようとしていますか? – Tim

答えて

2

本質的にランダムバイトが何であるかを持つ文字列をXORはあなたに、出力として有効な文字列を与えることを保証するものではありません。 var text = Encoding.ASCII.GetString(data);は、無効な文字列をバイト形式で渡しているため、失敗する可能性があります。プロセス内の情報を失うことなくランダムデータを表現するには、var text = Convert.ToBase64String(data)のようなものを使用する必要があります。

関連する問題