要解密的数据长度在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是哈希算法,是不可逆的(无法解密回实际值),那么您到底在做什么,加密或散列??对于已加密的值进行解密,非常感谢您的回复,感谢您,先生,为清楚起见,请在此张贴任何示例