[英]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.