РЕДАКТИРОВАТЬ: Хорошо, мы дошли до сути ... хотя проблема 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
.)