簡體   English   中英

對於C#Windows應用程序,要解密的數據長度在md5中無效

[英]Length of the data to decrypt is invalid in md5 for C# Windows application

我在這行上收到解密錯誤“要解密的數據長度無效”

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

我從SQL數據庫獲取此加密值,並在網格視圖中顯示該值之前,我想解密該加密值(該值來自sqldb)。 加密過程運行良好,但是解密過程導致了此問題。 據我所知,我正確地傳遞了數據,所以我不知道此錯誤來自何處。

我正在從組合框和日期時間選擇器中選擇選項,並且正在使用自己的數據訪問層進行連接。

我的代碼如下:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    RetrieveGrid(comboBox1.SelectedIndex);      
}

private void RetrieveGrid(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);
}

您正在將字符串編碼為UTF-8以將其獲取為字節數組,這不是在字節數組和字符串之間進行轉換的穩定方法。 如果您有一個字節數組,請使用Encoding.UTF8.GetString對其進行Encoding.UTF8.GetString ,然后使用Encoding.UTF8.GetBytes對其進行Encoding.UTF8.GetBytes ,但不能保證會得到一個具有相同字節值的數組。

編碼僅以另一種方式起作用,即使用Encoding.UTF8.GetBytes對字符串進行Encoding.UTF8.GetBytes ,然后使用Encoding.UTF8.GetString對其進行Encoding.UTF8.GetString將產生完全相同的字符串。 您只能解碼以前已編碼的數據,如果嘗試解碼任意字節,則可能不是有效的UTF-8。

如果要將字節數組存儲為字符串值,則應使用專用於此的編碼,例如base64。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM