Длина данных для расшифровки недопустима в md5 для приложения C # windows - PullRequest
0 голосов
/ 04 августа 2011

Я получаю ошибку дешифрования «Длина данных для расшифровки недопустима» в этой строке

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

Я получаю это зашифрованное значение из базы данных sqldatabase и перед его отображением в виде сетки хочу расшифроватьзашифрованное значение (значение, полученное из sqldb).Процесс шифрования идет хорошо, но процесс дешифрования вызывает эту проблему.Насколько я могу судить, я передаю данные правильно, поэтому я не знаю, откуда происходит эта ошибка.

Я выбираю опции из выпадающего списка и выбора даты и времени, и я использую свой собственный dataAccessслой для подключения.

Мой код ниже:

       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);
      }

1 Ответ

0 голосов
/ 04 августа 2011

Вы кодируете строки как UTF-8, чтобы получить их как байтовые массивы, что не является стабильным способом преобразования между байтовыми массивами и строками.Если у вас есть байтовый массив, декодируйте его, используя Encoding.UTF8.GetString, а затем кодируйте его, используя Encoding.UTF8.GetBytes, вы не гарантированно получите массив с такими же значениями байтов.

Кодирование работает только другим способом, т.е.кодирование строки с использованием Encoding.UTF8.GetBytes и последующее декодирование с использованием Encoding.UTF8.GetString приведет к точно такой же строке.Вы можете декодировать только те данные, которые были закодированы ранее, если вы пытаетесь декодировать любые произвольные байты, это может быть недопустимым UTF-8.

Если вы хотите сохранить байтовый массив как строковое значение, вы должны использоватькодировка, предназначенная для этого, например base64.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...