Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 29.03.2018
Сообщений: 4
1

SecureString вместо String (пример в сообщении)

29.03.2018, 13:31. Показов 1413. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. Есть метод который шифрует файлы (AES256) - найден на просторах всея интернета и немного доработан для моих нужн (курсача)
Помогите пожалуйста оптимизировать код так, что бы метод принимал password не просто типа string, а тип securestring
Смотрел примеры использования securestring, но не смог понять как это реализовать на этом примере

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public void Encrypt(string password, string path_file) 
        {
            try
            {
                //Зашифровать файл
                PasswordDeriveBytes pdb = new PasswordDeriveBytes(password, null); //класс, позволяющий генерировать ключи на базе паролей
                pdb.HashName = "SHA512"; //будем использовать SHA512
                alg.KeySize = KeyMaxSize; //устанавливаем размер ключа
                alg.Key = pdb.GetBytes(KeyMaxSize >> 3); //получаем ключ из пароля
                alg.Mode = CipherMode.CBC; //используем режим CBC
                alg.IV = new Byte[alg.BlockSize >> 3]; //и пустой инициализационный вектор
                ICryptoTransform tr = alg.CreateEncryptor(); //создаем encryptor
                FileStream instream = new FileStream(path_file, FileMode.Open, FileAccess.Read, FileShare.Read);
                FileStream outstream = new FileStream(path_file + ".safe", FileMode.Create, FileAccess.Write, FileShare.None);
                int buflen = ((2 << 16) / alg.BlockSize) * alg.BlockSize;
                byte[] inbuf = new byte[buflen];
                byte[] outbuf = new byte[buflen];
                int len;
                while ((len = instream.Read(inbuf, 0, buflen)) == buflen)
                {
                    int enclen = tr.TransformBlock(inbuf, 0, buflen, outbuf, 0); //шифруем
                    outstream.Write(outbuf, 0, enclen);
                }
                instream.Close();
                outbuf = tr.TransformFinalBlock(inbuf, 0, len); //шифруем финальный блок
                outstream.Write(outbuf, 0, outbuf.Length);
                outstream.Close();
                alg.Clear();
            }
            catch { MessageBox.Show("Ошибка в Encrypt"); }
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.03.2018, 13:31
Ответы с готовыми решениями:

Как присвоить типу System.Security.SecureString тип string?
Как передать строку типа string в параметр типа System.Security.SecureString?

Пустой экран, вместо сообщении об ошибках PHP
Подскажите, как настроить вывод сообщений об ошибках на этапе компиляции (интерпритации или как там...

Дата: В двух строках вместо дат идёт строка null, как вместо Date вернуть "-" в виде String?
На входе есть строки с датами разных форматов. Я обрабатываю их так: public static Date...

Найти в сообщении все ip-адреса, записать результат, используя класс string и класс StringBuilder
Задача: Находит в сообщении все ip-адреса, я могу написать при помощи регулярных выражений, но не...

13
910 / 795 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
29.03.2018, 14:03 2
с учётом того в Вашем коде всё упирается в PasswordDeriveBytes у Вас 2 решения:
1) в метод передаёте SecureString, а для PasswordDeriveBytes переводите либо в обычную строку, либо в массив байт (поведение метода при этом неизвестно толком)
2) пишите свой PasswordDeriveBytes который сразу будет принимать SecureString
0
0 / 0 / 0
Регистрация: 29.03.2018
Сообщений: 4
29.03.2018, 14:12  [ТС] 3
SeIZVeIZ, первый вариант так себе, т.к. в оперативке будет храниться само значение пароля, может быть есть какой либо наглядный пример для этого метода? Или можно как то обойти использование PasswordDeriveBytes?
0
910 / 795 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
29.03.2018, 14:23 4
можете посмотреть реализацию этого класса, и достать оттуда то что Вам нужно, в Вашем случае это метод GetBytes вот и смотрите его реализацию, что для него нужно и пробуйте восстановить уже с нужными Вам параметрами.

Добавлено через 1 минуту
но там в любом случае строка приводится к массиву байт и этот массив уже участвует в работе, возможно Вам всё же нужно перевести SecureString в массив байт
0
0 / 0 / 0
Регистрация: 11.02.2012
Сообщений: 12
29.03.2018, 14:36 5
SeIZVeIZ, и правда, не хотелось бы лезть в эту шляпу...
Допустим я преобразую securestring в байты, а как именно этот массив вставить в пример метода?
0
910 / 795 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
29.03.2018, 14:39 6
FrankMen, вместо password в конструкторе класса в виде строки, там есть конструктор который принимает массив байт
1
Эксперт .NET
17791 / 12942 / 3381
Регистрация: 17.09.2011
Сообщений: 21,215
29.03.2018, 19:03 7
Ну и конечно же класс PasswordDeriveBytes помечен как Obsolete (читайте предупреждения компилятора!).
Вместо него стоит использовать Rfc2898DeriveBytes.
1
Эксперт .NET
6508 / 4085 / 1605
Регистрация: 09.05.2015
Сообщений: 9,551
01.04.2018, 03:17 8
И SecureString тоже использовать не рекомендуется, т.к. тип не портабельный, только под виндой поддерживается.
0
0 / 0 / 0
Регистрация: 11.02.2012
Сообщений: 12
20.11.2018, 01:13 9
kolorotur, вернулся к своему курсовому, если заменить устаревший класс на Rfc2898DeriveBytes, то теперь ругается на pdb.HashName = "SHA512";
Подскажите как с этим быть?
0
0 / 0 / 0
Регистрация: 11.02.2012
Сообщений: 12
20.11.2018, 14:59 10
Кто нибудь подскажет, как это метод "HashName" задать для Rfc2898DeriveBytes?
0
910 / 795 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
20.11.2018, 15:11 11
FrankMen, вы принципиально документацию не читаете?
0
0 / 0 / 0
Регистрация: 11.02.2012
Сообщений: 12
20.11.2018, 15:17 12
SeIZVeIZ, блин, не заметил я этого метода, hashAlgorithm, оно ведь?
Если да, то насколько ещё SHA512 актуален, по собственному опыту может более надёжный знаете?
0
910 / 795 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
20.11.2018, 15:22 13
оно оно, а у Вас есть другой выбор в данном методе? новых вроде не придумывали SHA 3 там вроде как пытались сделать, но не слышал вышло ли что-то с этого
1
0 / 0 / 0
Регистрация: 11.02.2012
Сообщений: 12
22.11.2018, 01:16 14
SeIZVeIZ, спасибо

Добавлено через 6 часов 31 минуту
SeIZVeIZ, вот это прикол, нет перегрузки с 4 параметрами для этого метода, ругается, что лишний параметр указал, 4-ый, а именно хеш алгоритм, как быть?

Добавлено через 26 минут
SeIZVeIZ, нашел решение) обновил до 4.7.2 фрейм и пакеджи скачал последние для VS, видимо в старых сборках этого не было

Добавлено через 3 часа 27 минут
Помогите пожалуйста с этим разобраться. После замены на класс Rfc2898DeriveBytes выдаёт ошибку: "Заполнение неверно и не может быть удалено". Код привел ниже.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
public static int KeyMaxSize = 0;
public static SymmetricAlgorithm alg = (SymmetricAlgorithm)RijndaelManaged.Create();
public static KeySizes[] ks = alg.LegalKeySizes; //получаем список допустимых размеров ключей
 
 
 
        #region 2018 11
        public static void Encrypt1(string password, string path_file)
        {
            try
            {
 
                //для ключа
                Proc1.Inic();
 
 
                //Зашифровать файл
                Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, 32, 10000, HashAlgorithmName.SHA512);
 
 
                alg.KeySize = KeyMaxSize; //устанавливаем размер ключа
                alg.Key = pdb.GetBytes(KeyMaxSize >> 3); //получаем ключ из пароля
                alg.Mode = CipherMode.CBC; //режим CBC
                alg.IV = new Byte[alg.BlockSize >> 3]; //и пустой инициализационный вектор
                ICryptoTransform tr = alg.CreateEncryptor(); //создаем encryptor
                FileStream instream = new FileStream(path_file, FileMode.Open, FileAccess.Read, FileShare.Read);
                FileStream outstream = new FileStream(path_file, FileMode.Create, FileAccess.Write, FileShare.None);
                int buflen = ((2 << 16) / alg.BlockSize) * alg.BlockSize;
                byte[] inbuf = new byte[buflen];
                byte[] outbuf = new byte[buflen];
                int len;
                while ((len = instream.Read(inbuf, 0, buflen)) == buflen)
                {
                    int enclen = tr.TransformBlock(inbuf, 0, buflen, outbuf, 0); //собственно шифруем
                    outstream.Write(outbuf, 0, enclen);
                }
                instream.Close();
                outbuf = tr.TransformFinalBlock(inbuf, 0, len); //шифруем финальный блок
                outstream.Write(outbuf, 0, outbuf.Length);
                outstream.Close();
                alg.Clear();
            }
            catch (Exception x) { MessageBox.Show("Encrypt: " + x.Message, "Исключение", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        }
 
        public static void Decrypt1(string password, string path_file)
        {
            try
            {
                //для ключа
                Proc1.Inic();
 
                //Расшифровать файл
                Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, 32, 10000, HashAlgorithmName.SHA512);
 
                int keylen = KeyMaxSize;
                alg.KeySize = keylen;
                keylen >>= 3;
                alg.Key = pdb.GetBytes(keylen);
                alg.Mode = CipherMode.CBC;
                alg.IV = new Byte[alg.BlockSize >> 3];
                ICryptoTransform tr = alg.CreateDecryptor();
                FileStream instream = new FileStream(path_file, FileMode.Open, FileAccess.Read, FileShare.Read);
                FileStream outstream = new FileStream(path_file_decrypted, FileMode.Create, FileAccess.Write, FileShare.None);
                int buflen = ((2 << 16) / alg.BlockSize) * alg.BlockSize;
                byte[] inbuf = new byte[buflen];
                byte[] outbuf = new byte[buflen];
                int len;
                while ((len = instream.Read(inbuf, 0, buflen)) == buflen)
                {
                    int declen = tr.TransformBlock(inbuf, 0, buflen, outbuf, 0);
                    outstream.Write(outbuf, 0, declen);
                }
                instream.Close();
                outbuf = tr.TransformFinalBlock(inbuf, 0, len);
                outstream.Write(outbuf, 0, outbuf.Length);
                outstream.Close();
                alg.Clear();
                MessageBox.Show("Расшифровка завершена", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception x) { MessageBox.Show("Decrypt1: " + x.Message, "Исключение", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        }
 
        //Инициализация размера ключа для шифрования/дешифрования
        public static void Inic()
        {
            //alg = (SymmetricAlgorithm)RijndaelManaged.Create(); //начальное значение
            //ks 
            for (int i = 0; i < ks.Length; i++)
            {
                KeyMaxSize = ks[i].MaxSize;
            }
        }
 
#endregion
Добавлено через 11 часов 16 минут
Ауу!?) Кто нибудь отреагирует?

Добавлено через 11 часов 58 минут
kolorotur, выручайте, вы предложили мне эту идею, теперь голову ломаю, как это реализовать для конкретного примера
0
22.11.2018, 01:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.11.2018, 01:16
Помогаю со студенческими работами здесь

Как работать с SecureString?
Скажите в чем смысл этого класса? Строку в него преобразовать еще можно, но вот обратно вообще...

Undefined вместо string
Есть функция для чтения данных из БД через ajax: /* Запрос в БД на чтение данных ...

string c . вместо , to double
Здравствуйте Подскажите, как мне записать в бинарный файл число как double, если у него...

Пример class+string+ofstream/ifstream
Доброе время суток всем пресутствующим ) Если кому не сложно кинте пожалуйста сюда пример...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru