Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.04.2012, 00:58   #1
Bubaleh
Пользователь
 
Регистрация: 08.09.2011
Сообщений: 18
Восклицание Заполнение неверно и не может быть удалено

Привет всем!
Я воспользовался готовым примером из документации MSDN для класса AesCryptoServiceProvider - алгоритма из библиотеки System.Security.Cryptography. Но этот алгоритм себя чересчур странно ведет: когда я помещаю функции в форму, на которой шифруются текстовые поля, все работает нормально. Но стоит мне выделить эти методы в отдельный класс я получаю ошибку, когда пытаюсь дешифровать строку: "Заполнение неверно и не может быть удалено".

Последний раз редактировалось Bubaleh; 25.04.2012 в 01:01.
Bubaleh вне форума Ответить с цитированием
Старый 25.04.2012, 00:58   #2
Bubaleh
Пользователь
 
Регистрация: 08.09.2011
Сообщений: 18
По умолчанию

Вот пример созданного класса:

Код:

class Coder
    {
        string key = "䐫ิ駠뮧抷竂ﳁ焧㝺큎뒹ꥐ챐캲ກ"; // Ключ всегда один и тот же
        string iv = string.Empty;// Меняется только вектор инициализации
        
        // Шифровка
        public string Encrypt(string str)
        {
            System.Security.Cryptography.AesCryptoServiceProvider aes = new System.Security.Cryptography.AesCryptoServiceProvider();
        
            System.Text.UnicodeEncoding enc = new UnicodeEncoding();
            aes.Key = enc.GetBytes(key); // Перевод в массив байтов ключа
            aes.GenerateIV(); // Генерация вектора инициализации
            iv = enc.GetString(aes.IV); // Сохранение вектора инициализации в виде строки для последующей расшифровки
            
            return enc.GetString(EncryptStringToBytes_Aes(str, aes.Key, aes.IV)); ;
        }

        // Расшифровка
        public string Decrypt(string str)
        {
            System.Text.UnicodeEncoding enc = new UnicodeEncoding();
            byte[] Key = enc.GetBytes(key); // Ключ в массив байтов
            byte[] IV = enc.GetBytes(iv); // Вектор инициализации из строки в байты
            
            byte[] mas = enc.GetBytes(str); // Зашифрованная строка в байты
            return DecryptStringFromBytes_Aes(mas, Key, IV);
        }


        // Функции Microsoft
        static byte[] EncryptStringToBytes_Aes(string plainText, byte[] Key, byte[] IV)
        {
            // Check arguments.
            if (plainText == null || plainText.Length <= 0)
                throw new ArgumentNullException("plainText");
            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");
            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("Key");
            byte[] encrypted;
            // Create an RC2CryptoServiceProvider object
            // with the specified key and IV.
            using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
            {
                aesAlg.Key = Key;
                aesAlg.IV = IV;

                // Create a decrytor to perform the stream transform.
                ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

                // Create the streams used for encryption.
                using (MemoryStream msEncrypt = new MemoryStream())
                {
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                        {

                            //Write all data to the stream.
                            swEncrypt.Write(plainText);
                        }
                        encrypted = msEncrypt.ToArray();
                    }
                }
            }


            // Return the encrypted bytes from the memory stream.
            return encrypted;
        }


        static string DecryptStringFromBytes_Aes(byte[] cipherText, byte[] Key, byte[] IV)
        {
            // Check arguments.
            if (cipherText == null || cipherText.Length <= 0)
                throw new ArgumentNullException("cipherText");
            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");
            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("Key");

            // Declare the string used to hold
            // the decrypted text.
            string plaintext = null;

            // Create an RC2CryptoServiceProvider object
            // with the specified key and IV.
            using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
            {
                aesAlg.Key = Key;
                aesAlg.IV = IV;

                // Create a decrytor to perform the stream transform.
                ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

                // Create the streams used for decryption.
                using (MemoryStream msDecrypt = new MemoryStream(cipherText))
                {
                    using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                    {
                        using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                        {
                            // Read the decrypted bytes from the decrypting stream
                            // and place them in a string.

                            // В этом месте выдает ОШИБКУ!!!
                            plaintext = srDecrypt.ReadToEnd();
                        }
                    }
                }

            }

            return plaintext;
        }

    }
Может,кто-то уже с таким сталкивался?!Помогите,пожалуйста,кт о чем может
Bubaleh вне форума Ответить с цитированием
Старый 25.04.2012, 01:21   #3
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

А как вы с этим класом работаете?
=master= вне форума Ответить с цитированием
Старый 25.04.2012, 10:48   #4
Bubaleh
Пользователь
 
Регистрация: 08.09.2011
Сообщений: 18
По умолчанию

Вот пример работы с классом в программе на WinForms:
Код:
public partial class Form1 : Form
    { 
        Coder code = new Coder();

        public Form1()
        {
            InitializeComponent();            
        }

        // Клик по кнопке зашифровать (шифрует нормально,без ошибок)
        private void buttonEncode_Click(object sender, EventArgs e)
        {
            textBoxResult.Text = code.Encrypt(textBoxText.Text);
        }

        // Клик по кнопке расшифровать
        private void buttonDecode_Click(object sender, EventArgs e)
        {
            textBoxResult.Text = code.Decrypt(user.Default.str);
        }

    }
Раньше соответствующий код класса Coder лежал у меня непосредственно в классе данной формы, ошибки с дешифровкой возникали крайне редко: когда строка шифровалась несколько раз, а затем единожды дешифровалась.

Последний раз редактировалось Bubaleh; 25.04.2012 в 10:52.
Bubaleh вне форума Ответить с цитированием
Старый 25.04.2012, 11:17   #5
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Попробуйте в функции декрита указать в начале
aesAlg.Padding = PaddingMode.None;
в качестве "затычки" должно помочь.

Чего падает пока не понимаю. но где-то "кривятся" данные.
я так думаю. (с)
=master= вне форума Ответить с цитированием
Старый 25.04.2012, 14:02   #6
Bubaleh
Пользователь
 
Регистрация: 08.09.2011
Сообщений: 18
По умолчанию

Цитата:
=master=
Попробуйте в функции декрита указать в начале
aesAlg.Padding = PaddingMode.None;
в качестве "затычки" должно помочь.
Способ с Padding.None помогает,но дешифрует иногда неверно.Но все равно спасибо Как альтернативный вариант - вполне пригоден!
Я попробовал все string в классе на Char[] заменить - теперь вроде бы заработало и с заполнением по умолчанию...Но все равно странная ситуация: раньше-то и со string нормально работала, пока я в класс Coder не выделил...
Bubaleh вне форума Ответить с цитированием
Старый 25.04.2012, 14:15   #7
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

А зачем вы вообще стрингами держите?
byte[] iv сразу, да и кей тоже.
=master= вне форума Ответить с цитированием
Старый 25.04.2012, 14:28   #8
Bubaleh
Пользователь
 
Регистрация: 08.09.2011
Сообщений: 18
По умолчанию

Стринги мне более удобно использовать. Но в данном случае от удобства придется отказаться.
Bubaleh вне форума Ответить с цитированием
Старый 28.04.2012, 08:54   #9
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

У меня есть оптимизированый класс шифрования. Умеет с одинаковой эфективностью кодировать как строки так и масссивы байтов любой длины. Ключ также может быть строкой. Если надо отпишитесь скину.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В чём может быть ошибка? Lindemann66 Qt и кроссплатформенное программирование С/С++ 1 18.08.2011 13:52
в чем может быть дело? saidmir C/C++ Базы данных 0 08.03.2011 14:10
Как такое может быть??? lennon Общие вопросы C/C++ 4 21.10.2009 03:10
Может быть так, что в мамку может попасть вирус и не загружать жесткий диск Berzhan Операционные системы общие вопросы 6 27.07.2009 21:40