TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();
byte[] tempByte = new byte[100];
tempByte = encrypt(txt_Last_Name.Text, tDESalg.Key, tDESalg.IV);
txt_Last_Name.Text = System.Text.ASCIIEncoding.ASCII.GetString(tempByte);
然后将txt_Last_Name发送到数据库,我可以看到数据库中有一些东西。在数据库中,姓氏为varchar(20)
解密呼叫的样本是......
TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();
string lastName = dr.GetString(dr.GetOrdinal("Last Name"));
if (isEncrypted)
{
byte[] toDecrypt = new ASCIIEncoding().GetBytes(lastName);
lastName = decrypt(toDecrypt, tDESalg.Key, tDESalg.IV);
}
txt_Last_Name.Text = lastName;
它在解密函数中炸弹:“csDecrypt.Read(fromEncrypt,0,fromEncrypt.Length);”我不明白为什么。我不确定它是否未正确存储在数据库中,或者我的转换不正确。
如果它意味着什么,进入解密函数的“数据”大小为16并包含非零值,但是“byte [] fromEncrypt”是一个大小为16的数组,包含全零。
感谢您的帮助!
答案 0 :(得分:3)
编辑:好的,我们已经到底了......虽然ASCII问题也会被咬过。
每当您创建新的TripleDESCryptoServiceProvider
并要求输入密钥/ IV时,它都会生成一个新密钥。您需要将其安全地存储在某处,因为它需要解密数据。否则你没有任何“秘密”,所以它不是真正的加密......
这是一个糟糕的主意:
txt_Last_Name.Text = System.Text.ASCIIEncoding.ASCII.GetString(tempByte);
tempByte
中有任意二进制数据。 不要假设它是有效的ASCII文本。这几乎肯定是你丢失数据的地方。
使用Convert.ToBase64String
和Convert.FromBase64String
将不透明的二进制数据安全地编码为文本。
此外,这是一个坏主意:
byte[] tempByte = new byte[100];
tempByte = encrypt(txt_Last_Name.Text, tDESalg.Key, tDESalg.IV);
如果你要忽略它,创建一个字节数组有什么意义呢?使用
byte[] tempByte = encrypt(txt_Last_Name.Text, tDESalg.Key, tDESalg.IV);
代替。哦,并尝试遵循.NET命名约定:)
说完所有这些后,如果你的加密总是返回一个16个零的字节数组,那么这是一个非常明确的信号,表明你的encrypt
方法已被破坏。在您发布该方法的代码之前,我们无法真正帮助您。
最后,如果您的列属于varchar(20)
类型,您应该知道,这可能很难保存您需要的所有数据...特别是如果您要包含盐。 Base64会稍微增加数据的大小,加密也可能会这样做。正如另一个答案中所提到的,将其作为二进制存储在数据库中会在许多方面更加明智。
(注意:即使你 想要使用该代码,我也会将其写为txt_Last_Name.Text = Encoding.ASCII.GetString(tempByte);
。使用指令是你的朋友,ASCII
是属性Encoding
,而不是ASCIIEncoding
。)
答案 1 :(得分:0)
只需reading the doc ...您应该使用Convert.ToBase64String()
将byte []转换为字符串。
答案 2 :(得分:0)
Convert.ToBase64String(),如上面推荐的pascal,或者将数据作为二进制文件存储在数据库中而不是文本中(首选解决方案,因为它会占用更少的空间)。在SQL Server中,出于此目的,存在VARBINARY(MAX)数据类型。