要解密的数据长度在md5 for C#Windows应用程序中无效

要解密的数据长度在md5 for C#Windows应用程序中无效,c#,sql,C#,Sql,我在这一行得到解密错误“要解密的数据长度无效” byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length-1); 我从SQL数据库获取这个加密值,在网格视图中显示它之前,我想解密加密值(来自sqldb的值)。加密过程运行良好,但解密过程导致了此问题。据我所知,我正在正确地传递数据,所以我不知道这个错误是从哪里来的 我从组合框和日期时间选择器中选择选项,并使用自己的数据

我在这一行得到解密错误“要解密的数据长度无效”

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);
}
private void组合框1\u SelectedIndexChanged(对象发送方,事件参数e)
{
RetrieveGrid(comboBox1.SelectedIndex);
}
私有void RetrieveGrid(int-istatus)
{
数据集ds=新数据集();
IDBManager dbManager=新的dbManager(DataProvider.SqlServer);
//SqlConnection con=新的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.storedProcess,“sp_Getdata”);
对于(int j=0;j
您将字符串编码为UTF-8,以将其作为字节数组,这不是字节数组和字符串之间转换的稳定方式。如果您有一个字节数组,请使用
Encoding.UTF8.GetString
对其进行解码,然后使用
Encoding.UTF8.GetBytes
对其进行编码,则不能保证获得具有相同字节值的数组

编码只能以另一种方式工作,即使用
Encoding.UTF8.GetBytes
对字符串进行编码,然后使用
Encoding对其进行解码。UTF8.GetString
将生成完全相同的字符串。您只能对以前编码过的数据进行解码,如果您尝试对任意字节进行解码,它可能是无效的UTF-8


如果要将字节数组存储为字符串值,则应使用专用的编码,例如base64。

AFAIK,MD5是哈希算法,是不可逆的(无法解密回实际值),那么您到底在做什么,加密或散列??对于已加密的值进行解密,非常感谢您的回复,感谢您,先生,为清楚起见,请在此张贴任何示例