c#tripleDESCrypto从sql保存和检索不起作用

嘿那里,所以在msSQL数据库中,我正在使用存储过程保存和检索。我正在尝试在放置之前加密c#windows窗体中的某些数据,然后当我将其拉回时当然会对其进行解密。所有加密都在c#侧处理。我正在使用示例代码从microsoft的tripleDESCryptoService类(内存版本,第二个示例)逐字加密和解密。值被加密并发送到数据库,但是在检索它时会出现“错误数据”错误。 加密呼叫的样本是......
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的数组,包含全零。 谢谢你的帮助!     
已邀请:
编辑:好的,我们已经到底了...虽然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
。)     
只需阅读文档...您应该使用
Convert.ToBase64String()
将您的byte []转换为String。     
Convert.ToBase64String(),如上面推荐的pascal,或者将数据作为二进制文件存储在数据库中而不是文本中(首选解决方案,因为它会占用更少的空间)。在SQL Server中,出于此目的,存在VARBINARY(MAX)数据类型。     

要回复问题请先登录注册