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

Недопустимая длина данных для дешифрования

14.04.2018, 11:37. Показов 6477. Ответов 14

Студворк — интернет-сервис помощи студентам
Привет! Шифрование идет как по маслу (в моём случае огромная xml - разметка), а вот при дешифровке выдает ошибку:
"Недопустимая длина данных для дешифрования". Использовал данный класс в консольном приложении при шифровании и дешифровке маленького текста по типу "hello world" - все работало.

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
static class Encryption
    {
        static string key = "ABCDEFGH";
 
        static string IV = "ABCDEFGH";
 
        static FileStream stream;
 
        static DESCryptoServiceProvider cryptic = new DESCryptoServiceProvider();
 
        static CryptoStream crStream;
 
        static byte[] data;
 
        static public void Crypt(string filePath, string text)
        {
            stream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write);
            cryptic.Key = ASCIIEncoding.ASCII.GetBytes(key);
            cryptic.IV = ASCIIEncoding.ASCII.GetBytes(IV);
            crStream = new CryptoStream(stream, cryptic.CreateEncryptor(), CryptoStreamMode.Write);
            data = ASCIIEncoding.ASCII.GetBytes(text);
            crStream.Write(data, 0, data.Length);
            crStream.Close();
            stream.Close();
        }
 
        static public string Decrypt(string filePath)
        {
            stream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
            cryptic.Key = ASCIIEncoding.ASCII.GetBytes(key);
            cryptic.IV = ASCIIEncoding.ASCII.GetBytes(IV);
            crStream = new CryptoStream(stream, cryptic.CreateDecryptor(), CryptoStreamMode.Read);
            StreamReader reader = new StreamReader(crStream);
            string data = reader.ReadToEnd();
            reader.Close();
            stream.Close();
            return data;
        }
    }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.04.2018, 11:37
Ответы с готовыми решениями:

Недопустимая длина массива знаков Base-64
Добрый день, не могу вот разобраться в чем дело...... Пишет Недопустимая длина массива знаков Base-64. public DataTable...

Проблемы с хранимой процедурой, недопустимая длина параметра..
Здравствуйте, проблема в кратце такова. Есть хранимая процедура, обновляющая запись. У неё один из параметров имеет тип text. В...

"Недопустимая длина данных для дешифрования" при использовании AES
Всем привет. Столкнулся с проблемой шифрования. Вот ресурс: http://easylab.net.ua/net-c-windows-forms/c-algoritm-shifrovaniya-aes ...

14
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18279 / 14202 / 5368
Регистрация: 17.03.2014
Сообщений: 28,882
Записей в блоге: 1
14.04.2018, 13:27
Litovsky, возможно проблема возникает из-за использования FileMode.OpenOrCreate при шифровании. Если файл существует, то он будет открыт и данные будут записываться поверх и если новые шифруемые данные короче старых, то в файле останется хвост от старых зашифрованных данных.

Еще я бы использовал кодировку UTF8 для данных. Для ключа и вектора инициализации можно оставить ASCII при условии что не планируется использовать кириллицу.

И наконец непонятно зачем тут использовать static переменные.

Предлагаемое исправление:
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
    static class Encryption
    {
        static readonly byte[] key, IV;
        
        static Encryption()
        {
            key = Encoding.ASCII.GetBytes("ABCDEFGH");
            IV = Encoding.ASCII.GetBytes("ABCDEFGH");
        }
 
        static public void Crypt(string filePath, string text)
        {
            using (var cryptic = new DESCryptoServiceProvider())
            using (var stream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
            {
                cryptic.Key = key;
                cryptic.IV = IV;
                using (var crStream = new CryptoStream(stream, cryptic.CreateEncryptor(), CryptoStreamMode.Write))
                using (var writer = new StreamWriter(crStream))
                {
                    writer.Write(text);
                }
            }
        }
 
        static public string Decrypt(string filePath)
        {
            using (var cryptic = new DESCryptoServiceProvider())
            using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                cryptic.Key = key;
                cryptic.IV = IV;
                using (var crStream = new CryptoStream(stream, cryptic.CreateDecryptor(), CryptoStreamMode.Read))
                using (StreamReader reader = new StreamReader(crStream))
                {
                    return reader.ReadToEnd();
                }
            }
        }
    }
3
0 / 0 / 1
Регистрация: 06.12.2015
Сообщений: 26
14.04.2018, 14:04  [ТС]
OwenGlendower, проверил работоспособность. Спасибо за замечание и исправления.
0
 Аватар для Милт
4 / 54 / 6
Регистрация: 20.05.2013
Сообщений: 272
08.06.2022, 06:00
Подскажите как зашифровать строку без записи её в файл. Класс который написал OwenGlendower работает нормально, но он всегда записывает текст в файл. Не понимаю как сделать без записи зашифрованного текста в файл. То есть, надо просто оставить зашифрованный текст в переменной типа string.
0
Эксперт .NET
 Аватар для Usaga
14138 / 9367 / 1350
Регистрация: 21.01.2016
Сообщений: 35,243
08.06.2022, 09:06
Милт, обратите внимание, что код OwenGlendower'а работает со стримами (new FileStream - Stream). Стримы умеют не только с файлами работать. Но и с памятью (MemoryStream), и сетью и архивами...
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18279 / 14202 / 5368
Регистрация: 17.03.2014
Сообщений: 28,882
Записей в блоге: 1
08.06.2022, 09:31
Милт, заменяем FileStream на MemoryStream и - вуаля! - данные не записываются на диск. Остается взять байты из него и превратить в строку используя Base64.
0
 Аватар для Милт
4 / 54 / 6
Регистрация: 20.05.2013
Сообщений: 272
12.06.2022, 22:03
Не получается сделать методы для шифрования и дешифровки текста. После различных вариантов, появилась та же самая ошибка "Недопустимая длина данных для дешифрирования". Шифруется текст вроде нормально, но обратно не расшифровывается. Подскажите, что не так сделал.

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
private void button1_Click(object sender,EventArgs e){
string original = "Какой-то текст для шифрования";
var text = Encryption.Crypt(original); //зашифровать текст
MessageBox.Show(Encryption.Decrypt(text)); //расшифровать текст и отобразить
}
 
static class Encryption{ //класс для шифрования и дешифровки
static readonly byte[] key, IV;
 
static Encryption(){
key = Encoding.ASCII.GetBytes("ABCDEFGH");
IV = Encoding.ASCII.GetBytes("ABCDEFGH");    }
 
static public string Crypt(string text){ //метод для шифрования текста
using (var cryptic = new DESCryptoServiceProvider())
using (var stream = new MemoryStream()){
cryptic.Key = key;
cryptic.IV = IV;
var crStream = new CryptoStream(stream, cryptic.CreateEncryptor(), CryptoStreamMode.Write);
using (var writer = new StreamWriter(crStream))writer.Write(text);
return Convert.ToBase64String(stream.ToArray());
}}
 
static public string Decrypt(string text){  //метод для дешифровки текста
using (var cryptic = new DESCryptoServiceProvider())
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(text))){
cryptic.Key = key;
cryptic.IV = IV;
using (var crStream = new CryptoStream(stream, cryptic.CreateDecryptor(), CryptoStreamMode.Read))
using (StreamReader reader = new StreamReader(crStream))return reader.ReadToEnd();
}}
}
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18279 / 14202 / 5368
Регистрация: 17.03.2014
Сообщений: 28,882
Записей в блоге: 1
13.06.2022, 00:13
Милт, вот эту строку
C#
1
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(text))){
нужно заменить на
C#
1
using (var stream = new MemoryStream(Convert.FromBase64String(text))){
В целом класс лучше немого по другому оформить. Особенно не нравится то что ключ и вектор инициализации задаются в самом классе.
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
static class Encryption
{
    static public string Crypt(string text, byte[] key, byte[] iv)
    {
        if (text == null) throw new ArgumentNullException(nameof(text));
        if (key == null) throw new ArgumentNullException(nameof(key));
        if (iv == null) throw new ArgumentNullException(nameof(iv));
        if (key.SequenceEqual(iv)) throw new ArgumentException($"'{nameof(key)}' and '{nameof(iv)}' must be different");
        
        using (var cryptic = new DESCryptoServiceProvider())
        using (var stream = new MemoryStream())
        {
            cryptic.Key = key;
            cryptic.IV = iv;
            using (var crStream = new CryptoStream(stream, cryptic.CreateEncryptor(), CryptoStreamMode.Write))
            using (var writer = new StreamWriter(crStream))
            {
                writer.Write(text);
            }
            
            return Convert.ToBase64String(stream.ToArray());
        }
    }
 
    static public string Decrypt(string text, byte[] key, byte[] iv)
    {
        if (text == null) throw new ArgumentNullException(nameof(text));
        if (key == null) throw new ArgumentNullException(nameof(key));
        if (iv == null) throw new ArgumentNullException(nameof(iv));
        if (key.SequenceEqual(iv)) throw new ArgumentException($"'{nameof(key)}' and '{nameof(iv)}' must be different");
 
        using (var cryptic = new DESCryptoServiceProvider())
        using (var stream = new MemoryStream(Convert.FromBase64String(text)))
        {
            cryptic.Key = key;
            cryptic.IV = iv;
            using (var crStream = new CryptoStream(stream, cryptic.CreateDecryptor(), CryptoStreamMode.Read))
            using (StreamReader reader = new StreamReader(crStream))
            {
                return reader.ReadToEnd();
            }
        }
    }
}
1
 Аватар для Милт
4 / 54 / 6
Регистрация: 20.05.2013
Сообщений: 272
13.06.2022, 11:47
Я немного модернизировал этот класс. На сайте Майкрософт рекомендуется вместо класса DES использовать класс 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
private void button1_Click(object sender,EventArgs e){
string original = "Какой-то текст для шифрования";
var text = Encryption.Crypt(original, "ABCDEFGH34344343", "ABCDEFGH56565656"); //зашифровать текст
MessageBox.Show(text); //отобразить зашифрованный текст
text = Encryption.Decrypt(text,"ABCDEFGH34344343", "ABCDEFGH56565656"); //расшифровать текст 
MessageBox.Show(text); //отобразить расшифрованный текст
}
 
static class Encryption //класс для шифрования и дешифровки
{
    static public string Crypt(string text, string key, string iv) //метод для шифрования текста
    {
        if (text == null) throw new ArgumentNullException(nameof(text));
        if (key == null) throw new ArgumentNullException(nameof(key));
        if (iv == null) throw new ArgumentNullException(nameof(iv));
        if (key.SequenceEqual(iv)) throw new ArgumentException($"'{nameof(key)}' and '{nameof(iv)}' must be different");
 
        using (Aes aesAlg = Aes.Create())
        {
        aesAlg.Key = Encoding.UTF8.GetBytes(key); 
        aesAlg.IV = Encoding.UTF8.GetBytes(iv);
 
        ICryptoTransform cryptic = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
 
          using (var stream = new MemoryStream())
          {
            using (var crStream = new CryptoStream(stream, cryptic, CryptoStreamMode.Write))
            using (var writer = new StreamWriter(crStream))
            {
                writer.Write(text);
            }
            
            return Convert.ToBase64String(stream.ToArray());
          }
        }
    }
 
    static public string Decrypt(string text, string key, string iv) //метод для дешифровки текста
    {
        if (text == null) throw new ArgumentNullException(nameof(text));
        if (key == null) throw new ArgumentNullException(nameof(key));
        if (iv == null) throw new ArgumentNullException(nameof(iv));
        if (key.SequenceEqual(iv)) throw new ArgumentException($"'{nameof(key)}' and '{nameof(iv)}' must be different");
 
 
       using (Aes aesAlg = Aes.Create())
       {
       aesAlg.Key = Encoding.UTF8.GetBytes(key);
       aesAlg.IV = Encoding.UTF8.GetBytes(iv);
       ICryptoTransform cryptic = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
 
          using (var stream = new MemoryStream(Convert.FromBase64String(text)))
          {
             using (var crStream = new CryptoStream(stream, cryptic, CryptoStreamMode.Read))
             using (StreamReader reader = new StreamReader(crStream))
             {
                return reader.ReadToEnd();
             }
          }
       }
    }
}
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18279 / 14202 / 5368
Регистрация: 17.03.2014
Сообщений: 28,882
Записей в блоге: 1
13.06.2022, 11:57
Милт, если уже решили заменить byte[] на string для key и iv (напрасно на мой взгляд), то замените
C#
1
if (key.SequenceEqual(iv)) throw new ArgumentException($"'{nameof(key)}' and '{nameof(iv)}' must be different");
на
C#
1
if (key == iv) throw new ArgumentException($"'{nameof(key)}' and '{nameof(iv)}' must be different");
И рекомендую комментарии переделать в XML-комментарии.
0
 Аватар для Милт
4 / 54 / 6
Регистрация: 20.05.2013
Сообщений: 272
13.06.2022, 16:32
Цитата Сообщение от OwenGlendower Посмотреть сообщение
то замените
Можно, но сравнение всё равно работает.

Цитата Сообщение от OwenGlendower Посмотреть сообщение
напрасно на мой взгляд
Почему напрасно?

Цитата Сообщение от OwenGlendower Посмотреть сообщение
И рекомендую комментарии переделать в XML-комментарии.
Это для чего?
0
Эксперт .NET
 Аватар для Usaga
14138 / 9367 / 1350
Регистрация: 21.01.2016
Сообщений: 35,243
14.06.2022, 11:13
Цитата Сообщение от Милт Посмотреть сообщение
Это для чего?
Тогда их студия сможет подхватывать и показывать во всплывающих подсказках к методам и классам. А так же разные средства генерации документации будут такие комменты правильно воспринимать. Общепринятый подход в мире .NET. Ну или вообще не писать комментарии, если они тупые и капитанские...
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18279 / 14202 / 5368
Регистрация: 17.03.2014
Сообщений: 28,882
Записей в блоге: 1
14.06.2022, 13:22
Цитата Сообщение от Милт Посмотреть сообщение
Почему напрасно?
Потому что ключ это массив байтов, а не строка. Тот кто хочет использовать строку в качестве ключа и вектора может сам вызвать Encoding.UTF8.GetBytes и передать результат в Crypt/Decrypt.

Цитата Сообщение от Usaga Посмотреть сообщение
Ну или вообще не писать комментарии, если они тупые и капитанские...
+1
0
 Аватар для Милт
4 / 54 / 6
Регистрация: 20.05.2013
Сообщений: 272
17.06.2022, 00:18
Цитата Сообщение от Usaga Посмотреть сообщение
Ну или вообще не писать комментарии, если они тупые и капитанские
Я написал комментарии чтобы даже самым начинающим программистам было чуть понятнее. И просто потому что визуально заметнее где начало метода(когда много другого кода). Раньше я даже не знал что такое классы, но всё равно программировал. По этой же причине я переделал массив байт в строку, потому что так проще. Я именно этим руководствовался. В теории, можно было перенести создание ключа и вектора внутрь класса, как это было в первом сообщении темы, тогда были бы максимально простые методы, с одним параметром. Ну а кто соображает и кому надо, всегда могут переделать обратно на массив байт. Основная сложность была с MemoryStream и особенно с конвертацией в Base64, без знаний о методах конвертации не получалось сделать рабочий код. А алгоритм AES, рекомендуется использовать вместо DES.

Добавлено через 9 минут
Есть один момент, который не понятен. Для чего нежен вектор? Непонятно почему создатели класса не сделали один массив байт, который можно было программно разделить пополам, на два массива и не пришлось бы заставлять пользователей класса прописывать два массива.
0
Эксперт .NET
 Аватар для Usaga
14138 / 9367 / 1350
Регистрация: 21.01.2016
Сообщений: 35,243
17.06.2022, 05:36
Цитата Сообщение от Милт Посмотреть сообщение
Я написал комментарии чтобы даже самым начинающим программистам было чуть понятнее. И просто потому что визуально заметнее где начало метода(когда много другого кода).
Комментарии к коду, который ОЧЕВИДНЕЕ, чем содержательность этих самых комментариев, больше засоряют код, нежели добавляют ясности происходящему. Понимание этого факта придёт со временем.

Совсем же начинающим программистам никакие комментарии, особенно "мусорные" не помогут.

Ну и насчёт визуального выделения методов... Этот момент решается не комментариями, а поддержанием читаемости кода и ограничением его количества на единицу трансляции. Иными словами рефакторить надо и придерживаться культуры кода. Умные дядьки про это уже давно книжки пишут. Почитайте, вам очень полезно будет. Да и пишет автор легко и доступно.

Но это всё оффтоп)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.06.2022, 05:36
Помогаю со студенческими работами здесь

Недопустимая длина массива знаков Base-64
Уже часов пять пытаюсь понять в чем проблема. Когда пытаюсь пройти регистрацию оно выдаёт: System.FormatException: "Недопустимая...

Программа для шифрования и дешифрования текстовых данных
Помогите пожалуйста, мне нада написать в delphi программу для шифрования и дешифрования текстовых данных с тспользованием симметричных...

Недопустимая попытка чтения при отсутствии данных
Не могу понять почему выбивает эту ошибку:"недопустимая попытка чтения при отсутствии данных" int ID_contact = -1; ...

Написание программы шифрования и дешифрования данных шифром Цезаря
Написать код Цезаря для шифрования и дешифрования данных.(В коде Цезаря задан цифровой ключ и этот ключ задает смещение для алфавита)....

Создать форму, для вычисления длины окружности. Длина вычисляется в результате выделения данных текстового
Создать форму, для вычисления длины окружности. Длина вычисляется в результате выделения данных текстового поля.


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru