Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 05.11.2013
Сообщений: 29

Ошибка в работе с RSA при расшифровке данных

21.11.2014, 10:39. Показов 5479. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
вот тут строка зашифровывается нормально
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
 
public string RSA(string Name)
        {
            RSACryptoServiceProvider RsaKey = new RSACryptoServiceProvider();
            byte[] data = new byte[64];
            data = Encoding.Default.GetBytes(Name);
 
            byte[] EncryptedData = RsaKey.Encrypt(data, false);
            string ent_data = Encoding.Default.GetString(EncryptedData);
           
 
            return ent_data;
        }
сохраняю в базе, а при расшифровке выдает ошибку плохие данные!

C#
1
2
3
4
5
6
7
8
9
10
11
       public string RSA(string Name)
        {
            RSACryptoServiceProvider RsaKey = new RSACryptoServiceProvider();
            byte[] data = new byte[64];
            data = Encoding.Default.GetBytes(Name);
            
            byte[] DecryptedData = RsaKey.Decrypt(data, false);
           
            string ent_data = BitConverter.ToString(DecryptedData);
            return ent_data;
        }
в чем ошибка??
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.11.2014, 10:39
Ответы с готовыми решениями:

Ошибка при расшифровке пакета [RSA]
Всем удачного нового года! Столкнулся с проблемой при расшифровке сообщения, закодированного с помощью RSA. Вырезка из RSA.cs:...

Ошибка при расшифровке массива
Задача 14. На основе программы из примера 6 разработать программу шифрования и расшифрования нижеуказанной строки .data X byte “best...

Ошибка при расшифровке файла [AES]
Ругается, пишет: public byte AES_Decrypt(byte bytesToBeDecrypted, byte passwordBytes) { byte decryptedBytes =...

13
21.11.2014, 11:48

Не по теме:

Плохие данные? Накажи их:p

0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18267 / 14190 / 5368
Регистрация: 17.03.2014
Сообщений: 28,877
Записей в блоге: 1
21.11.2014, 12:20
maik09, алгоритм RSA использует пару ключей для своей работы. При шифровке и дешифровке следует использовать одинаковые ключи. Если ключи не установить, то RSACryptoServiceProvider будет использовать случайно сгенерированную пару и расшировать данные не получится.

Вторая ошибка это преобразование результата Encrypt в строку с помощью GetString(). Не каждый массив байтов является строкой. Кроме того использование Encoding.Default это мина замедленного действия в коде т.к. его значение зависит от текущих настроек локализации. Поэтому результатом операции шифрования должен быть масссив байтов, или строка где каждый байт представлен в HEX формате или base-64 строка. Последний вариант будет самым компактным.

В итоге код получится примерно таким:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public string RsaEncrypt(string text, string publicKey)
{
    using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
    {
        rsa.FromXmlString(publicKey);
        byte[] data = Encoding.UTF8.GetBytes(text);
        byte[] encryptedData = rsa.Encrypt(data, false);
        return Convert.ToBase64String(encryptedData);
    }
}
 
public string RsaDecrypt(string base64text, string privateKey)
{
    using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
    {
        rsa.FromXmlString(privateKey);
        
        byte[] data = Convert.FromBase64String(base64text);
        byte[] decryptedData = rsa.Decrypt(data, false);
        return Encoding.UTF8.GetString(decryptedData);
    }
}
Значения public/private ключей нужно будет получить предварительно:
C#
1
2
string publicKey = rsa.ToXmlString(false);
string privateKey = rsa.ToXmlString(true);
Public ключ можно хранить открыто, а private нужно хорошо спрятать. Также можно использовать методы ExportParameters/ImportParameters. В документации есть пример.
1
0 / 0 / 0
Регистрация: 05.11.2013
Сообщений: 29
21.11.2014, 13:40  [ТС]
теперь при расшифровке ошибка плохая длина!

Добавлено через 44 минуты
Недостаточно памяти для обработки команды.

Добавлено через 26 секунд
что это значит?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18267 / 14190 / 5368
Регистрация: 17.03.2014
Сообщений: 28,877
Записей в блоге: 1
21.11.2014, 14:16
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

maik09,
Цитата Сообщение от maik09 Посмотреть сообщение
теперь при расшифровке ошибка плохая длина!
У алгоритма RSA есть ограничение на длину шифруемых данных. Она должна меньше быть длины ключа, который по умолчанию имеет длину 1024 байта. Длину ключа менять произвольно также нельзя. Там тоже свои ограничения. Если тебе нужно шифровать большие объемы данных, то используй потоковые симметричные алгоритмы. Например, Tripple DES - TripleDESCryptoServiceProvider. На stackoverflow есть обсуждение на эту тему - how to use RSA to encrypt files (huge data) in C#
3
0 / 0 / 0
Регистрация: 11.02.2015
Сообщений: 16
26.05.2015, 15:53
Добрый день, извините, что апаю старую тему. Просто стало жутко интересно, можно-ли в качестве паблик ключа использовать свой? msdn весь прокурил, такое чувство, что нельзя
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18267 / 14190 / 5368
Регистрация: 17.03.2014
Сообщений: 28,877
Записей в блоге: 1
26.05.2015, 17:28
sergix, если ты внимательно посмотришь примеры в этой теме, то увидишь использование метода FromXmlString который как раз позволяет задать ключ. В дополнение к нему есть метод ImportParameters.
1
0 / 0 / 0
Регистрация: 11.02.2015
Сообщений: 16
27.05.2015, 07:50
Просмотрел... Сейчас ещё разок прочту. Просто надо именно задать паблик ключ, а второй сгенерить.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18267 / 14190 / 5368
Регистрация: 17.03.2014
Сообщений: 28,877
Записей в блоге: 1
27.05.2015, 14:53
sergix, по моему это невозможно. Если бы зная public ключ можно было сгенерировать private ключ, то от алгоритма RSA не было бы пользы.
0
0 / 0 / 0
Регистрация: 11.02.2015
Сообщений: 16
27.05.2015, 15:47
Конечно, вы правы! Но это же будет сделано на машине, где оба ключа генерируется. Тобишь просто он должен подходить, а не получив паблик нужно сгенерировать точный приват ключ. В общем то мне всё ровно какой будет приват ключ, мне главное чтобы паблик ключ содержал мои данные, которые можно было бы разобрать тому, кто его получит для шифрования.
То есть.
Я создаю из "КЛЮЧКЛЮЧКЛЮЧ" пару ключей, приват храню у себя. И хочу чтобы отправив паблик ключ для шифрования дальнейших сообщений второму человеку, он ещё и получил данные "КЛЮЧКЛЮЧКЛЮЧ".
Например чтобы сам модуль был равен данным.
Эта нарушит условие самого RSA?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18267 / 14190 / 5368
Регистрация: 17.03.2014
Сообщений: 28,877
Записей в блоге: 1
27.05.2015, 19:33
Цитата Сообщение от sergix Посмотреть сообщение
Я создаю из "КЛЮЧКЛЮЧКЛЮЧ" пару ключей
Поясни.
0
0 / 0 / 0
Регистрация: 11.02.2015
Сообщений: 16
28.05.2015, 08:43
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Поясни.
Я имею данные, допустим 1364D943(ну значительно больше, это пример) в 16ричной системе.
Я хочу чтобы эти данные стали паблик ключем для дальнейшего шифрования. Чтобы тот, кто получил паблик ключ, получил эти-же 1364D943 данные и смог их использовать.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18267 / 14190 / 5368
Регистрация: 17.03.2014
Сообщений: 28,877
Записей в блоге: 1
28.05.2015, 11:20
sergix, открытый ключ строится на основе Modulus и Exponent. Причем Exponent всегда равна 65537 (AQAB в base64). То есть теоретически мы можем записать в Modulus любое значение при условии что его длина подходит под разрешенные размеры ключа от 48 до 2048 байтов. Однако т.к. нам неизвестны другие параметры, то сгенерировать парный закрытый ключ мы не сможем и значит расшифровать данные не получится. В итоге эта идея мне кажется неверной, но возможно я ошибаюсь. Что именно ты пытаешься получить таким способом? То есть зачеми передавать данные внутри открытого ключа или выдавая их за него?
0
0 / 0 / 0
Регистрация: 11.02.2015
Сообщений: 16
28.07.2015, 10:45
OwenGlendower, большое спасибо за ответы. Разобрался. Отказался от старой идее. Хотел в паблик ключ записать такое значение, что он бы являлся частью данных, таким образом получилось бы, что серверу не приходится слать лишнюю инфу.
В общем решил сделать другим путем, результатом доволен. Но идея ещё жива, буду дальше об этом думать)

Добавлено через 15 секунд
OwenGlendower, большое спасибо за ответы. Разобрался. Отказался от старой идее. Хотел в паблик ключ записать такое значение, что он бы являлся частью данных, таким образом получилось бы, что серверу не приходится слать лишнюю инфу.
В общем решил сделать другим путем, результатом доволен. Но идея ещё жива, буду дальше об этом думать)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.07.2015, 10:45
Помогаю со студенческими работами здесь

Ошибка при работе с базой данных
Здравствуйте. При попытки чтения строк из БД в работе программы возникает ошибка "Ссылка на объект не указывает на экземпляр...

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

Ошибка при работе с базой данных
скажите почему ошибка при этих строках: sqdb.insert(sms.TABLE_NAME1, sms.NAME1, cv); sqdb.execSQL("CREATE TABLE " +...

Аппаратная ошибка видео (Ошибка при работе с видеоустройствами привела к некорректной работе Windows).
Аппаратная ошибка видео. Последнее время во время игры Call of Duty: Modern Warfare 2 в мультиплеер, (между сменами карт, как только...

OpenSSL ошибка bad magic number при расшифровке AES-256-CBC
У меня есть файл file.bin с вот таким содержимым: —рSu©€њqCQb8?x¶8чm оYЋxй%“+ЛД‚!њеЪГ.MxР+>XИ§шч И есть ключ: ...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru