0 / 0 / 0
Регистрация: 03.07.2019
Сообщений: 35
1
.NET 4.x

Как использовать ключ RSA в AES шифрование?

25.07.2019, 01:25. Показов 4391. Ответов 20

Author24 — интернет-сервис помощи студентам
Никак не могу сообразить как мне правильно сделать реализацию чтобы впихнуть ключ RSA 2048 в шифрование AES.

У меня есть этот метод AES шифрования:

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
        
public static void AES_Encrypt(string inputFile, string password)
{
            try
            {
                byte[] passBytes = Encoding.UTF8.GetBytes(password);
                byte[] saltBytes = new byte[12];
 
                using (MemoryStream tempStream = new MemoryStream())
                {
                    using (var inputFileStream = new FileStream(inputFile, FileMode.Open))
                        inputFileStream.CopyTo(tempStream);
 
                    tempStream.Position = 0;
 
                    using (var outFileStream = new FileStream(inputFile, FileMode.Create))
                    using (var rijndaelManaged = new RijndaelManaged())
                    {
                        rijndaelManaged.KeySize = 256;
                        rijndaelManaged.BlockSize = 128;
                        using (var rfc2898DeriveBytes = new Rfc2898DeriveBytes(passBytes, saltBytes, 1000))
                        {
                            rijndaelManaged.Key = rfc2898DeriveBytes.GetBytes(rijndaelManaged.KeySize / 8);
                            rijndaelManaged.IV = rfc2898DeriveBytes.GetBytes(rijndaelManaged.BlockSize / 8);
                        }
                        rijndaelManaged.Mode = CipherMode.CBC;
                        using (var cryptoStream = new CryptoStream(outFileStream, rijndaelManaged.CreateEncryptor(), CryptoStreamMode.Write))
                        {
                            tempStream.CopyTo(cryptoStream);
                        }
                    }
                }
            }
            catch (CryptographicException ex) { File.AppendAllText("AES_Enc.txt", ex.Message + "\r\n" + ex.ToString()); }
            catch (IOException ex) { File.AppendAllText("AES_Enc_IO.txt", ex.Message + "\r\n" + ex.ToString()); }
            catch (UnauthorizedAccessException) { }
}
 
public static void AES_Decrypt(string inputFile, string password)
{
            try
            {
                byte[] passBytes = Encoding.UTF8.GetBytes(password);
                byte[] saltBytes = new byte[12];
 
                using (MemoryStream tempStream = new MemoryStream())
                {
                    using (var inputFileStream = new FileStream(inputFile, FileMode.Open))
                        inputFileStream.CopyTo(tempStream);
 
                    tempStream.Position = 0;
 
                    using (var outFileStream = new FileStream(inputFile, FileMode.Create))
                    using (var rijndaelManaged = new RijndaelManaged())
                    {
                        rijndaelManaged.KeySize = 256;
                        rijndaelManaged.BlockSize = 128;
                        using (var rfc2898DeriveBytes = new Rfc2898DeriveBytes(passBytes, saltBytes, 1000))
                        {
                            rijndaelManaged.Key = rfc2898DeriveBytes.GetBytes(rijndaelManaged.KeySize / 8);
                            rijndaelManaged.IV = rfc2898DeriveBytes.GetBytes(rijndaelManaged.BlockSize / 8);
                        }
                        rijndaelManaged.Mode = CipherMode.CBC;
                        using (var cryptoStream = new CryptoStream(tempStream, rijndaelManaged.CreateDecryptor(), CryptoStreamMode.Read))
                        {
                            cryptoStream.CopyTo(outFileStream);
                        }
                    }
                }
            }
            catch (CryptographicException ex) { File.AppendAllText("AES_Enc.txt", ex.Message + "\r\n" + ex.ToString()); }
            catch (IOException ex) { File.AppendAllText("AES_Enc_IO.txt", ex.Message + "\r\n" + ex.ToString()); }
            catch (UnauthorizedAccessException) { }
}
У меня так же имеется публичный и приватный ключ который я получаю :

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public string GetKey(bool choice)
{
    string key = null;
    try
    {
         using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048))
         {
                    if (choice) 
                    { 
                       key = rsa.ToXmlString(false);
                    }
                    else 
                    { 
                       key = rsa.ToXmlString(true); 
                    }
                }
            }
            catch (CryptographicException) { }
            return key;
 }
Вопрос: Как полученный ключ запихнуть в AES ?
Имеется так же к ключу его шифрование взято от сюда: Как правильно генерировать ключ RSA-2048?

Его нужно использовать за место хэшифрования пароля?

C#
1
2
3
4
5
Using (var rfc2898DeriveBytes = new Rfc2898DeriveBytes(passBytes, saltBytes, 1000))
{
     rijndaelManaged.Key = rfc2898DeriveBytes.GetBytes(rijndaelManaged.KeySize / 8);
     rijndaelManaged.IV = rfc2898DeriveBytes.GetBytes(rijndaelManaged.BlockSize / 8);
}
Приватный ключ хранится в файле, для последующего расшифрования
А публичный ключ для шифрования нужно запихнуть в AES но там используется Key и IV Что мне нужно сделать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.07.2019, 01:25
Ответы с готовыми решениями:

Как поменять результат шифрование \ Метод шифрование RSA
Здравствуйте! Прошу помощи! В просторах интернета нашла одну статью в которой реализован метод...

Как правильно перевести ключ и вектор в байты Aes
Всем здрасте. Прошу прощения если такая тема уже была, но я толком ответа не нашел. Такой вопрос: у...

Как правильно генерировать ключ RSA-2048?
Подскажите как правильно сгенерировать приватный и закрытый ключ именно для RSA-2048 Я правильно...

RSA-шифрование. Зависает при больших числах P и Q. Как исправить?
Есть программа на C#, которая шифрует текст методом RSA. Но преподаватель требует в качестве P и Q...

20
Администратор
Эксперт .NET
17509 / 13738 / 5292
Регистрация: 17.03.2014
Сообщений: 28,217
Записей в блоге: 1
25.07.2019, 01:38 2
rudnight, AES и RSA совершенно разные алгоритмы. Зачем вы пытаетесь их смешать?
0
0 / 0 / 0
Регистрация: 03.07.2019
Сообщений: 35
25.07.2019, 01:48  [ТС] 3
Цитата Сообщение от OwenGlendower Посмотреть сообщение
AES и RSA совершенно разные алгоритмы. Зачем вы из пытаетесь их смешать?
Я хотел сам ключ от RSA использовать в AES если такое позволяется сделать.
Чтобы один ключ хранился у меня а другой в программе.

Добавлено через 6 минут
И когда требуется сделать расшифровку, то брался ключ из файла.
А так он тут генерирует всё в программе и как-то не компильфо.
0
692 / 509 / 238
Регистрация: 02.10.2012
Сообщений: 1,741
25.07.2019, 09:48 4
Цитата Сообщение от rudnight Посмотреть сообщение
Я хотел сам ключ от RSA использовать в AES если такое позволяется сделать.
нельзя, прочитайте по какому принципу генерируются ключи для этих алгоритмов, и вопрос сам отпадет
0
Администратор
Эксперт .NET
17509 / 13738 / 5292
Регистрация: 17.03.2014
Сообщений: 28,217
Записей в блоге: 1
25.07.2019, 11:24 5
rudnight, ключ для AES тоже можно хранить в отдельном файле. Или вообще генерировать его на основе пароля вводимого пользователя.
0
0 / 0 / 0
Регистрация: 03.07.2019
Сообщений: 35
25.07.2019, 22:11  [ТС] 6
Цитата Сообщение от OwenGlendower Посмотреть сообщение
ключ для AES тоже можно хранить в отдельном файле
А можно пример ( Ключ же от rijndaelManaged.Key ) ?
Получается я никак не смогу использовать ключ от RSA 2048 в AES шифрование?

Как мне тогда придумать такую логику:
- Создаётся ключ для шифрования и расшифровки, один хранится в файле ( который служит для расшифровки ), а другой записан программно ( который шифрует ). У меня на уме пока это ключ RSA-2048 который даёт публичный и приватный ключ.

Чтобы без файла ( в котором хранится пароль ) нельзя было сделать расшифровку.

Добавлено через 4 часа 18 минут
ап....
0
Администратор
Эксперт .NET
17509 / 13738 / 5292
Регистрация: 17.03.2014
Сообщений: 28,217
Записей в блоге: 1
26.07.2019, 09:42 7
rudnight, ключи RSA работают не сами по себе, а в рамках алгоритма RSA. В других криптографических алгоритмах они не дадут волшебнымм образом такую же функциональность. Если вам нужна логика с двумя ключами, то почему вы не используете алгоритм RSA? В чем вообще задача состоит?
1
0 / 0 / 0
Регистрация: 03.07.2019
Сообщений: 35
26.07.2019, 12:38  [ТС] 8
Цитата Сообщение от OwenGlendower Посмотреть сообщение
В чем вообще задача состоит?
Я шифрую файл(ы) на диске алгоритмом AES.
Мне нужно сделать отдельный пароль для шифрования и расшифровки.
Мне нужно иметь один ключ для расшифровки, а другим ключём шифровать файл(ы) - Как вот это реализовать?
0
692 / 509 / 238
Регистрация: 02.10.2012
Сообщений: 1,741
26.07.2019, 12:42 9
а чем rsa не подходит? сохраняйте ключ в отдельный файл и все
0
0 / 0 / 0
Регистрация: 03.07.2019
Сообщений: 35
26.07.2019, 13:02  [ТС] 10
Цитата Сообщение от Immo Посмотреть сообщение
а чем rsa не подходит?
RSA-2048 не годится для шифрования файлов ( тем более больших, ну как я читал и мне рассказывали, и нужно 100 % AES )
Цитата Сообщение от Immo Посмотреть сообщение
сохраняйте ключ в отдельный файл и все
Вы что имеете в виду? AES или RSA-2048 ?
0
Модератор
Эксперт .NET
15746 / 10913 / 2830
Регистрация: 21.04.2018
Сообщений: 32,017
Записей в блоге: 2
26.07.2019, 13:49 11
Цитата Сообщение от rudnight Посмотреть сообщение
Я шифрую файл(ы) на диске алгоритмом AES.
Мне нужно сделать отдельный пароль для шифрования и расшифровки.
Мне нужно иметь один ключ для расшифровки, а другим ключём шифровать файл(ы) - Как вот это реализовать?
Цитата Сообщение от rudnight Посмотреть сообщение
RSA-2048 не годится для шифрования файлов ( тем более больших, ну как я читал и мне рассказывали, и нужно 100 % AES )
Не вдаваясь в подробности зачем это нужно, один из алгоритмов:
  • Получаете пару RSA ключей.
  • Это пара постоянная.
  • Для конкретного файла получаете ключ AES.
  • Этот ключ одноразовый и подходит только к этому файлу.
  • Шифруете AES ключ открытым ключом RSA. Зашифрованный блок всегда выравниваете по одному размеру.
  • Создаёте новый файл.
  • Пишите в него последовательно: зашифрованный AES ключ и информацию зашифрованную AES ключом.
  • Для чтения открывает файл с зашифрованным ключом и информацией.
  • Читает зашифрованный ключ AES.
  • Расшифровываете его закрытым ключом RSA
  • Полученным ключом расшифровываете остающуюся информацию.
1
0 / 0 / 0
Регистрация: 03.07.2019
Сообщений: 35
26.07.2019, 13:52  [ТС] 12
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для конкретного файла получаете ключ AES.
Начну с этого, как получить этот ключ? Это же KEY и IV ?
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Шифруете AES ключ открытым ключом RSA. Зашифрованный блок всегда
Вот это я и хочу изначально сделать, но не понимаю как это реализовать.
0
Модератор
Эксперт .NET
15746 / 10913 / 2830
Регистрация: 21.04.2018
Сообщений: 32,017
Записей в блоге: 2
26.07.2019, 14:14 13
Цитата Сообщение от rudnight Посмотреть сообщение
Начну с этого, как получить этот ключ? Это же KEY и IV ?
Я не шибко силён в этой теме. Знания поверхностные, чисто теоретические. На практике не использовал.

Судя по https://docs.microsoft.com/en-... mework-4.8

Для шифрование/дешифрования нужен экземпляр AesCryptoServiceProvider. При создании новго экземпляра создаются Key и IV. И то и другое имеет тип byte[].
RSA шифрует именно такой тип https://docs.microsoft.com/ru-... mework-4.8

Можно зашифровать Key и IV отдельно, можно сделать общий массив - задав в первых элементах длины Key и IV.
0
Администратор
Эксперт .NET
17509 / 13738 / 5292
Регистрация: 17.03.2014
Сообщений: 28,217
Записей в блоге: 1
27.07.2019, 00:09 14
Цитата Сообщение от rudnight Посмотреть сообщение
Я шифрую файл(ы) на диске алгоритмом AES.
Зачем?

Цитата Сообщение от rudnight Посмотреть сообщение
Мне нужно сделать отдельный пароль для шифрования и расшифровки.
Зачем?

Цитата Сообщение от rudnight Посмотреть сообщение
Мне нужно иметь один ключ для расшифровки, а другим ключём шифровать файл(ы) - Как вот это реализовать?
Зачем?
0
0 / 0 / 0
Регистрация: 03.07.2019
Сообщений: 35
27.07.2019, 01:14  [ТС] 15
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Зачем?
Чтобы защитить данные от просмотра.
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Зачем?
Уже писал же чтобы не хранить ключ внутри программы, а хотелось бы использовать отдельно в файле ключ ( для расшифровки )

Добавлено через 10 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для шифрование/дешифрования нужен экземпляр AesCryptoServiceProvider
Хорошо, значит я должен сгенерировать пароль специальный задав аргументы
C#
1
byte[] Key, byte[] IV
для
C#
1
RijndaelManaged
или
C#
1
AesCryptoServiceProvider
( А у них есть какая-нибудь разница ? ).
Мне тогда получается нужно как-то создать метод который будет шифровать этот Key на подобие Этого метода
0
Модератор
Эксперт .NET
15746 / 10913 / 2830
Регистрация: 21.04.2018
Сообщений: 32,017
Записей в блоге: 2
27.07.2019, 01:28 16
Цитата Сообщение от rudnight Посмотреть сообщение
Я шифрую файл(ы) на диске алгоритмом AES.
Мне нужно сделать отдельный пароль для шифрования и расшифровки.
Цитата Сообщение от rudnight Посмотреть сообщение
Чтобы защитить данные от просмотра.
Я в тему глубоко не вникал, но Вы, по-моему, что-то путаете.

Смысл RSA шифра: зашифровать дынные может любой, а расшифровать только тот у кого есть второй ключ.

Если же вы сами шифруете и расшифровываете, то тогда нужно симметричное шифрование, то есть когда используется один ключ для шифрования и расшифровывания. И AES достаточно без никаких изощрений с RSA.

Так что Вам нужно?
0
0 / 0 / 0
Регистрация: 03.07.2019
Сообщений: 35
27.07.2019, 01:35  [ТС] 17
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Смысл RSA шифра: зашифровать дынные может любой, а расшифровать только тот у кого есть второй ключ.
Это я знаю, по этому принципу я и пытаюсь донести информацию, может я как-то не правильно формулирую вопрос, простите уж.
На данный момент я использую Aes и так, но мне нужно ещё дополнительно использовать Rsa но мне говорят не то что нужно путают, я понимаю что это разные алгоритмы, rsa мне нужен для шифрования ключа который генерируется в Aes и только.
Именно по этому я хочу сделать себе отдельный файл где будет хранится ключ, и чтобы другие пользователи не могу просто так взять и расшифровать файлы.
0
Модератор
Эксперт .NET
15746 / 10913 / 2830
Регистрация: 21.04.2018
Сообщений: 32,017
Записей в блоге: 2
27.07.2019, 01:40 18
Цитата Сообщение от rudnight Посмотреть сообщение
Именно по этому я хочу сделать себе отдельный файл где будет хранится ключ, и чтобы другие пользователи не могу просто так взять и расшифровать файлы.
Всё равно какое-то противоречие.

Если шифруют информацию пользователи, то зачем здесь AES?
Если же шифруете и расшифровываете вы сами, то причём здесь RSA?

Ответьте на вопрос: Кто шифрует информацию и кто потом может/не может её расшифровать?
0
0 / 0 / 0
Регистрация: 03.07.2019
Сообщений: 35
27.07.2019, 01:47  [ТС] 19
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Кто шифрует информацию и кто потом может/не может её расшифровать?
У меня есть несколько пользователей на некоторых пк, где хранится очень ценная информация,
Я написал метод который шифрует файлы, это Aes вроде всё хорошо, но пароль key, и IV хранится внутри программы, я же хочу создать в файл приватный ключ и хранить у себя отдельно и если мне потребуется расшифровать файл какой-нибудь я беру приватный ключ, применяю его к ключу Aes и расшифровываю данные ( как-то так ), затем я наткнулся на метод rsa-2048 который имеет публичный ключ и приватный, именно он мне нужен не какой другой. Rsa-2048 я думал шифровать сгенерированный ключ AES и хранить его в файле, без которого нельзя было бы просто так взять и расшифровать файл.
0
Модератор
Эксперт .NET
15746 / 10913 / 2830
Регистрация: 21.04.2018
Сообщений: 32,017
Записей в блоге: 2
27.07.2019, 02:07 20
Цитата Сообщение от rudnight Посмотреть сообщение
Rsa-2048 я думал шифровать сгенерированный ключ AES и хранить его в файле, без которого нельзя было бы просто так взять и расшифровать файл.
Если вы сами шифруете файлы (без разницы целиком или только AES ключ), то RSA теряет смысл.

Если поставщики шифрованных данных пользователи, тогда да нужен RSA. Алгоритм примерно такой:
  • У пользователей есть публичный
  • Их данные шифруются этим ключом
  • После шифрования файлы находятся в публичном доступе
  • Расшифровать обратно эти файлы пользователи сами не могут
  • Вы получаете эти зашифрованные файлы и расшифровываете с помощью приватного ключа

В этой схеме применение AES шифрования уже выглядит бессмысленным. Только если (возможно - точно не знаю) на больших объёмах данных AES имеет сильное преимущество по скорости.

То есть как вы не объясняете- смысла в двойном шифровании не прибавляется.
0
27.07.2019, 02:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.07.2019, 02:07
Помогаю со студенческими работами здесь

Aes шифрование
Привет, нужна помощь, есть программная реализация aes, помогите определить в каком режиме...

AES шифрование
Видел кучу тем на эту тему, но так для себя решения и не нашел, здесь реализация заточена на текст,...

Установка 128bit-ключ для AES
При попытке установить AES ключ более 32 bit, появляется ошибка. :-\ using System; using...

Шифрование AES 128.
Привет. Нужно зашифровать string используя AES 128 битный. Что-то написал, но работать...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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