2011-08-04 8 views
0

のMD5で無効である私がこの暗号化された値を取得しています。このライン長さは、私は、復号誤り取得していますC#のWindowsアプリケーション

byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length-1); 

の「復号化するために、データの長さが無効です」 sqldatabaseを作成し、それをグリッドビューで表示する前に、暗号化された値(sqldbからの値)を復号化します。暗号化プロセスはうまくいっていますが、復号化プロセスがこの問題を引き起こしています。私が言う限りでは、データを正しく渡しているので、このエラーがどこから来ているのかわかりません。

私は、コンボボックスと日付時刻選択ツールからオプションを選択しています。自分のdataAccessレイヤーを使用して接続しています。

私のコードは以下の通りです:UTF-8など

 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      ReteriveGrid(comboBox1.SelectedIndex);  
     } 
     private void ReteriveGrid(int istatus) 
     { 
      DataSet ds = new DataSet(); 
      IDBManager dbManager = new DBManager(DataProvider.SqlServer); 
      //SqlConnection con = new SqlConnection("connectionstyring"); 
      dbManager.ConnectionString = ConfigurationSettings.AppSettings["SQLCN"].ToString(); 

      dbManager.Open(); 
      dbManager.CreateParameters(2); 
      dbManager.AddParameters(0, "@istatus", istatus); 
      dbManager.AddParameters(1, "@date", dateTimePicker1.Value.Date); 

      ds = dbManager.ExecuteDataSet(CommandType.StoredProcedure, "sp_Getdata"); 
      for (int j = 0; j < ds.Tables[0].Rows.Count; j++) 
      { 
       string DecryptText = ds.Tables[0].Rows[j][3].ToString().Trim(); 
       MessageBox.Show(DecryptText); 
      //Here Call The DecryptionMethod 
       string AfterDecrypText = Decrypt(DecryptText,true); 
       MessageBox.Show(AfterDecrypText); 
       ds.AcceptChanges(); 
      } 
     dataGridView1.DataSource = ds; 
     } 
public static string Decrypt(string cipherString, bool useHashing) 
     { 
      byte[] keyArray; 
      byte[] toEncryptArray = Convert.FromBase64String(cipherString); 
      System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader(); 
      //Get your key from config file to open the lock!(string)settingsReader.GetValue("SecurityKey", typeof(String)); 
      string key = "Trms"; 
      if (useHashing) 
      { 
       MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider(); 
       keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key)); 
       hashmd5.Clear(); 
      } 
      else 
       keyArray = UTF8Encoding.UTF8.GetBytes(key); 
      TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); 
      tdes.Key = keyArray; 
      tdes.Mode = CipherMode.ECB; 
      tdes.Padding = PaddingMode.PKCS7; 
      ICryptoTransform cTransform = tdes.CreateDecryptor(); 

      byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length-1); 
      tdes.Clear(); 
      return UTF8Encoding.UTF8.GetString(resultArray); 
     } 
+2

AFAIK、MD5はハッシュアルゴリズムであり、元に戻すことはできません(実際の値に戻すことはできません)。 –

+0

既に暗号化された値を解読するため – raheemvali

答えて

0

あなたがエンコードされた文字列をバイト配列としてそれらを得るために、それはバイト配列と文字列の間の変換の安定した方法ではありません。バイト配列を持ち、Encoding.UTF8.GetStringを使用してデコードした後、Encoding.UTF8.GetBytesを使用してエンコードすると、同じバイト値の配列を取得することは保証されません。

エンコーディングは逆の動作、つまりEncoding.UTF8.GetBytesを使用して文字列をエンコードし、Encoding.UTF8.GetStringを使用してデコードすると、まったく同じ文字列が生成されます。以前にエンコードされたデータのみをデコードすることができます。任意のバイトをデコードしようとすると、有効なUTF-8ではない可能性があります。

バイト配列を文字列値として格納する場合は、それを対象とするエンコーディング、たとえばbase64を使用する必要があります。

+0

Thnk uとても親切な返信のために – raheemvali

+0

これを明確にするためにありがとうございました – raheemvali

関連する問題