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

The length of the data to decrypt is not valid for the size of this key при попытки расшифровать байты блоками

11.06.2024, 16:59. Показов 1011. Ответов 17
Метки rsa (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, есть онлайн-приложение. При входе в него, сервер отправляет вошедшему пользователь его никнейм и аватарку. Эта информация шифруется публичным ключом этого пользователя. (шифруются каждые 128 байт информации)
Пользователю приходит эта информация и ему, логично, нужно расшифровать эти данные приватные ключом, собственно я так и делаю. (расшифровываются в блоки байт с размером 256, а затем преобразуются в общий массив)
Однако программа на стороне пользователя расшифровывает данные с ошибкой в конце. До тех пор, пока количество информации не перестанет быть 256, всё хорошо, но если информации станет на байт меньше, то выдаёт ошибку: "The length of the data to decrypt is not valid for the size of this key"
Код пользователя для расшифровки:
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
    List<byte> Decrypt(byte[] buffer, string private_key)
    {
 
        string pathTo = FileSystem.Current.CacheDirectory;
        if (Directory.Exists($"{pathTo}/temp"))
        {
            Directory.Delete($"{pathTo}/temp", true);
 
        }
 
        using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
        {
 
         
            List<byte> returnTo = new List<byte>();
        
 
                rsa.FromXmlString(private_key);
        
 
 
            Directory.CreateDirectory($"{pathTo}/temp");
            FileStream fs = File.Create($"{pathTo}/temp/decrypt.txt");
            fs.Write(buffer, 0, buffer.Length);
            fs.Close();
            using (FileStream fstreamIn = File.OpenRead($"{pathTo}/temp/decrypt.txt"))
            {
 
 
                byte[] buf = new byte[256];
 
                if (fstreamIn.Length <= 256)
                {
                    int bytesRead = fstreamIn.Read(buf, 0, buf.Length);
 
                    if (bytesRead != 0)
                    {
                        byte[] decrypted = rsa.Decrypt(buf, true);
 
                        for (int i = 0; i < decrypted.Length; i++)
                        {
                            returnTo.Add(decrypted[i]);
                        }
                    }
                }
                else
                {
 
                    
                        for (; ; )
                        {
 
                            int bytesRead = fstreamIn.Read(buf, 0, buf.Length);
 
                            Console.WriteLine(bytesRead + "!!!!!!!!!!!!!!!!!");
                        if (bytesRead == 0) break;
 
 
                        else if (bytesRead < 256)
                        {
                            byte[] current = new byte[bytesRead];
                            for (int i = 0; i < bytesRead; i++)
                            {
                                current[i] = buf[i];
 
                            }
                            byte[] decrypted = rsa.Decrypt(current, true);
 
                            for (int i = 0; i < decrypted.Length; i++)
                            {
                                returnTo.Add(decrypted[i]);
                            }
                        }
                        else
                        {
                            byte[] decrypted = rsa.Decrypt(buf, true);
 
                            for (int i = 0; i < decrypted.Length; i++)
                            {
                                returnTo.Add(decrypted[i]);
                            }
                        }
 
                            
 
 
 
                        }
                    
                    
                   
                
 
                }
 
                fstreamIn.Close();
                Directory.Delete($"{pathTo}/temp", true);
 
 
                return returnTo;
            }
 
        }
 
 
 
 
 
 
 
 
 
}
Что кидает в логах перед ошибкой:
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 256!!!!!!!!!!!!!!!!!
[DOTNET] 8!!!!!!!!!!!!!!!!!
// следовательно ошибка происходит, когда данных осталось всего 8 байт.

Код сервера (шифрование):
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
static List<byte> Decrypt(byte[] buffer, TcpClient tcpIP)
{
 
    IPEndPoint remoteIpEndPoint = tcpIP.Client.RemoteEndPoint as IPEndPoint;
   
    string ip  = remoteIpEndPoint.Address.ToString();
 
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
 
    List<byte> returnTo = new List<byte>();
    rsa.FromXmlString(_private);
   
        Directory.CreateDirectory($"{Directory.GetCurrentDirectory()}/temp/{ip}");
        FileStream fs = File.Create($"{Directory.GetCurrentDirectory()}/temp/{ip}/TEMP.txt");
            fs.Write(buffer, 0, buffer.Length);
            fs.Close();
        using (FileStream fstreamIn = File.OpenRead($"{Directory.GetCurrentDirectory()}/temp/{ip}/TEMP.txt"))
        {
          
       
            byte[] buf = new byte[256];
 
            if (fstreamIn.Length <= 256)
            {
                int bytesRead = fstreamIn.Read(buf, 0, buf.Length);
 
                if (bytesRead != 0)
                {
                    byte[] decrypted = rsa.Decrypt(buf, true);
                
                    for (int i = 0; i < decrypted.Length; i++)
                    {
                        returnTo.Add(decrypted[i]);
                    }
                }
            }
            else
            {
                
                for (; ; )
                {
                int bytesRead = fstreamIn.Read(buf, 0, buf.Length);
                Console.WriteLine(bytesRead + "!!!!!!!!!!!!!!!!!");
 
                if (bytesRead == 0) break;
 
                    byte[] decrypted = rsa.Decrypt(buf, true);
 
              
                    for (int i = 0; i < decrypted.Length; i++)
                    {
                        returnTo.Add(decrypted[i]);
                    }
                
             
              
                   
                }
              
            }
 
        fstreamIn.Close();
        Directory.Delete($"{Directory.GetCurrentDirectory()}/temp/{ip}", true);
       
 
            return returnTo;
 
        }
 
 
    
   
 
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.06.2024, 16:59
Ответы с готовыми решениями:

Length of the data to decrypt is invalid
Всем доброго времени суток. Не могли бы вы объяснить из-за чего происходит ошибка после конвертации byte и как ее решить? using...

Ошибка при работе с указателем! (key[0]->pr) x006790b8 {size=3 d=2 key=0x0067dcc8 {0xfdfdfdfd {pr=? }
#ifndef DHEAP_H #define DHEAP_H #include &lt;iostream&gt; #include &lt;locale.h&gt; #include &lt;cmath&gt; #include &lt;cstdlib&gt; #include &quot;Graph.h&quot; ...


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

Или воспользуйтесь поиском по форуму:
17
Эксперт .NET
 Аватар для Rius
13164 / 7724 / 1679
Регистрация: 25.05.2015
Сообщений: 23,527
Записей в блоге: 14
11.06.2024, 17:57
Цитата Сообщение от OrangeKeks Посмотреть сообщение
Что кидает в логах перед ошибкой:
[DOTNET] 256!!!!!!!!!!!!!!!!!
Зачем логи? Почему вы на своём ПК это не отладите?

Добавлено через 1 минуту
C#
1
$"{Directory.GetCurrentDirectory()}/temp/{ip}/TEMP.txt"
Что это за дичь?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
11.06.2024, 18:08
Цитата Сообщение от OrangeKeks Посмотреть сообщение
Код пользователя для расшифровки:
Ужасный код. Вы зачем-то пишете данные во временный файл, вместо прямого чтения из buffer. Делаете кучу выделений памяти когда можно использовать один и тот же буфер. В итоге код длинный, неэффективный и трудный в понимании. Можно проще:
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
List<byte> Decrypt(byte[] buffer, string private_key)
{
    var returnTo = new List<byte>(0);
    using (var rsa = new RSACryptoServiceProvider())
    {
        rsa.FromXmlString(private_key);
        
        const int CHUNK = 256;
        int chunks = buffer.Length / CHUNK + (buffer.Length % CHUNK > 0 ? 1 : 0);
        
        byte[] decrypted = new byte[CHUNK];
        for (int i=0; i<chunks; i++)
        {
            int offset = i*CHUNK;
            int size = Math.Min(CHUNK, buffer.Length-offset);
            ReadOnlySpan<byte> bufferSpan = buffer.AsSpan()[offset..(offset+size)];
            
            int bytesWritten = rsa.Decrypt(bufferSpan, decrypted.AsSpan(), RSAEncryptionPadding.OaepSHA1);
            
            returnTo.Capacity += bytesWritten;
            returnTo.AddRange(decrypted.AsSpan()[..bytesWritten]);
        }
    }
    
    return returnTo;
}

Цитата Сообщение от OrangeKeks Посмотреть сообщение
Код сервера (шифрование):
В этом коде такие же проблемы как и в первом и это снова код дешифрования. Нужен код шифрования.
1
0 / 0 / 0
Регистрация: 07.07.2022
Сообщений: 93
11.06.2024, 18:19  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
В этом коде такие же проблемы как и в первом и это снова код дешифрования. Нужен код шифрования.
Извиняюсь, ошибся.
Код шифрования:
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
static List<byte> EncryptFile(byte[] buffer, string key)
 {
     List<byte> result = new List<byte>();
     string pathTo = Directory.GetCurrentDirectory();
 
     using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
     {
         rsa.FromXmlString(key);
 
         FileStream fs = File.Create($"{pathTo}/TEMP.txt");
         fs.Write(buffer, 0, buffer.Length);
         fs.Close();
         using (FileStream fstreamOut = new FileStream($"{pathTo}/TEMP.txt", FileMode.Open, FileAccess.Read))
         {
      
             byte[] buf = new byte[128];
             for (; ; )
             {
                 int bytesRead = fstreamOut.Read(buf, 0, buf.Length);
                 if (bytesRead == 0) break;
                 byte[] encrypted = bytesRead == buf.Length ? rsa.Encrypt(buf, true) : rsa.Encrypt(buf.Take(bytesRead).ToArray(), true);
                 for (int i = 0; i < encrypted.Length; i++)
                 {
                     result.Add(encrypted[i]);
                 }
             }
             fstreamOut.Close();
             File.Delete($"{pathTo}/TEMP.txt");
           
             return result;
         }
     }
 }
0
Эксперт .NET
 Аватар для Rius
13164 / 7724 / 1679
Регистрация: 25.05.2015
Сообщений: 23,527
Записей в блоге: 14
11.06.2024, 18:23
Что такое
Цитата Сообщение от OrangeKeks Посмотреть сообщение
CurrentDirectory
???

Цитата Сообщение от OrangeKeks Посмотреть сообщение
FileStream fs = File.Create($"{pathTo}/TEMP.txt");
         fs.Write(buffer, 0, buffer.Length);
         fs.Close();
         using (FileStream fstreamOut = new FileStream($"{pathTo}/TEMP.txt", FileMode.Open, FileAccess.Read))
Нахрена сохранять в файл и потом читать обратно?
0
0 / 0 / 0
Регистрация: 07.07.2022
Сообщений: 93
11.06.2024, 18:30  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
???
Возвращает директорию, откуда была открыта программа.
Цитата Сообщение от Rius Посмотреть сообщение
Нахрена сохранять в файл и потом читать обратно?
По-другому не умею
0
Эксперт .NET
 Аватар для Rius
13164 / 7724 / 1679
Регистрация: 25.05.2015
Сообщений: 23,527
Записей в блоге: 14
11.06.2024, 18:44
Цитата Сообщение от OrangeKeks Посмотреть сообщение
Возвращает директорию, откуда была открыта программа.
А вы всегда запускаете программу через терминал из каталога программы или ярлыком, в котором указана установка рабочего каталога, и этот каталог 100% не меняется по ходу работы программы?

Цитата Сообщение от OrangeKeks Посмотреть сообщение
По-другому не умею
Массив можно читать побайтово, он уже есть, блоками по нужному количеству.
Чем поток проще?

Добавлено через 8 минут
Тем более, уже применяете
C#
1
buf.Take(bytesRead)
Добавлено через 2 минуты
Пример RSA туда и обратно
https://www.codeguru.co.in/202... ample.html
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
void Main()
{
 
    var keySize=2048;
    var rsaCryptoServiceProvider = new RSACryptoServiceProvider(keySize);
 
    var cipherText = Encrypt("hello world", rsaCryptoServiceProvider.ExportParameters(false));
    var plainText = Decrypt(cipherText, rsaCryptoServiceProvider.ExportParameters(true));
    Console.WriteLine(plainText);
 
}
public string Encrypt(string data, RSAParameters key)
{
 
    using (var rsa = new RSACryptoServiceProvider())
    {
        rsa.ImportParameters(key);
        var byteData = Encoding.UTF8.GetBytes(data);
        var encryptData = rsa.Encrypt(byteData, false);
        return Convert.ToBase64String(encryptData);
    }
}
 
public string Decrypt(string cipherText, RSAParameters key)
{
 
    using (var rsa = new RSACryptoServiceProvider())
    {
        var cipherByteData = Convert.FromBase64String(cipherText);
        rsa.ImportParameters(key);
 
        var encryptData = rsa.Decrypt(cipherByteData, false);
        return Encoding.UTF8.GetString(encryptData);
    }
}
0
0 / 0 / 0
Регистрация: 07.07.2022
Сообщений: 93
11.06.2024, 18:53  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Пример RSA туда и обратно
Слишком большие данные нужно делить на блоки, что я и делаю. Это не решение моей проблемы.
0
Эксперт .NET
 Аватар для Rius
13164 / 7724 / 1679
Регистрация: 25.05.2015
Сообщений: 23,527
Записей в блоге: 14
11.06.2024, 18:57
Насколько большие?

Добавлено через 2 минуты
Не помещающиеся в память гигабайты, поэтому предполагаете читать блоками по 256 байт с диска и шифровать отдельные несвязанные куски?

Цитата Сообщение от OrangeKeks Посмотреть сообщение
сервер отправляет вошедшему пользователь его никнейм и аватарку. Эта информация шифруется публичным ключом этого пользователя. (шифруются каждые 128 байт информации)
0
0 / 0 / 0
Регистрация: 07.07.2022
Сообщений: 93
11.06.2024, 19:09  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Насколько большие?
около 10 мегабайт. Ключ шифрования с размером 2048 бит не может зашифровать такой объём данных за раз. У меня уже были подобные темы.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
11.06.2024, 19:19
Цитата Сообщение от OrangeKeks Посмотреть сообщение
около 10 мегабайт.
Многовато для RSA. Я думал что у вас меньшие объемы. Почему не используете симметричные алгоритмы шифрования?
0
0 / 0 / 0
Регистрация: 07.07.2022
Сообщений: 93
11.06.2024, 20:08  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Можно проще:
Изменил весь код, как вы Сказали. Ошибка та же, что и в заголовке темы

Добавлено через 3 минуты
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Почему не используете симметричные алгоритмы шифрования?
Хочу заняться этим потом, а сейчас хочу подробно изучить RSA
0
Эксперт .NET
 Аватар для Rius
13164 / 7724 / 1679
Регистрация: 25.05.2015
Сообщений: 23,527
Записей в блоге: 14
11.06.2024, 20:08
Вот.
Только скорость никакущая.

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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
using System;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
 
namespace OrangeKeks
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var keySize = 2048;
            var rsaCryptoServiceProvider = new RSACryptoServiceProvider(keySize);
            var publikKey = rsaCryptoServiceProvider.ExportParameters(false);
            var privateKey = rsaCryptoServiceProvider.ExportParameters(true);
 
            {
                var testText = "1234";
                var testTextBuffer = Encoding.UTF8.GetBytes(testText);
 
                var sourceStream = new MemoryStream();
                sourceStream.Write(testTextBuffer, 0, testTextBuffer.Length);
                sourceStream.Position = 0;
 
                var encryptedStream = new MemoryStream();
                Encrypt(sourceStream, encryptedStream, publikKey);
 
                encryptedStream.Position = 0;
 
                var decryptedStream = new MemoryStream();
                Decrypt(encryptedStream, decryptedStream, privateKey);
 
                var testText2 = Encoding.UTF8.GetString(decryptedStream.ToArray());
                Console.WriteLine(testText2);
            }
 
            {
                using (var sourceStream = new FileStream("R:\\test.bin", FileMode.Open, FileAccess.Read, FileShare.Read, 1024 * 1024))
                {
                    using (var encryptedStream = new FileStream("R:\\test.encrypted", FileMode.Create, FileAccess.Write, FileShare.Read, 1024 * 1024))
                    {
                        Encrypt(sourceStream, encryptedStream, publikKey);
                    }
                }
 
                using (var encryptedStream = new FileStream("R:\\test.encrypted", FileMode.Open, FileAccess.Read, FileShare.Read, 1024 * 1024))
                {
                    using (var decryptedStream = new FileStream("R:\\test2.bin", FileMode.Create, FileAccess.Write, FileShare.Read, 1024 * 1024))
                    {
                        Decrypt(encryptedStream, decryptedStream, privateKey);
                    }
                }
            }
        }
 
        static void Encrypt(Stream source, Stream output, RSAParameters key)
        {
            using (var rsa = new RSACryptoServiceProvider())
            {
                rsa.ImportParameters(key);
                var buffer = new byte[128];
                int position = 0;
 
                while (true)
                {
                    var readed = source.Read(buffer, 0, buffer.Length);
 
                    if (readed == 0) break;
 
                    // Только для прогресса в консоли.
                    if (source.Position > (65536))
                    {
                        Console.WriteLine("{0:n0}", source.Position);
                        position += 65536;
                    }
 
                    var encrypted = rsa.Encrypt((readed < buffer.Length) ? buffer.Take(readed).ToArray() : buffer, false);
 
                    output.Write(encrypted, 0, encrypted.Length);
                }
            }
        }
 
        static void Decrypt(Stream source, Stream output, RSAParameters key)
        {
            using (var rsa = new RSACryptoServiceProvider())
            {
                rsa.ImportParameters(key);
                var buffer = new byte[256];
                int position = 0;
 
                while (true)
                {
                    var readed = source.Read(buffer, 0, buffer.Length);
 
                    if (readed == 0) break;
 
                    // Только для прогресса в консоли.
                    if (source.Position > (65536))
                    {
                        Console.WriteLine("{0:n0}", source.Position);
                        position += 65536;
                    }
 
                    var decryptData = rsa.Decrypt((readed < buffer.Length) ? buffer.Take(readed).ToArray() : buffer, false);
 
                    output.Write(decryptData, 0, decryptData.Length);
                }
            }
        }
    }
}
1
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
11.06.2024, 20:23
Цитата Сообщение от Rius Посмотреть сообщение
Только скорость никакущая.
Так RSA никогда не был про скорость, это медленный алгоритм и им обычно шифруют только небольшое количество данных...
1
0 / 0 / 0
Регистрация: 07.07.2022
Сообщений: 93
12.06.2024, 00:29  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
List<byte> Decrypt(byte[] buffer, string private_key)
{
    var returnTo = new List<byte>(0);
    using (var rsa = new RSACryptoServiceProvider())
    {
        rsa.FromXmlString(private_key);
const int CHUNK = 256;
        int chunks = buffer.Length / CHUNK + (buffer.Length % CHUNK > 0 ? 1 : 0);
byte[] decrypted = new byte[CHUNK];
        for (int i=0; i<chunks; i++)
        {
            int offset = i*CHUNK;
            int size = Math.Min(CHUNK, buffer.Length-offset);
            ReadOnlySpan<byte> bufferSpan = buffer.AsSpan()[offset..(offset+size)];
int bytesWritten = rsa.Decrypt(bufferSpan, decrypted.AsSpan(), RSAEncryptionPadding.OaepSHA1);
returnTo.Capacity += bytesWritten;
            returnTo.AddRange(decrypted.AsSpan()[..bytesWritten]);
        }
    }
return returnTo;
}
Можете скинуть точно такой же код, но для зашифровки?

Добавлено через 10 минут
Destination is too short. - ошибка

Добавлено через 2 часа 15 минут
Код рабочий, я просто нашаманил что-то. Просьба остается прежней. Можете, пожалуйста, дать аналогичный код, только для шифрования? Спасибо
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
12.06.2024, 01:02
Цитата Сообщение от OrangeKeks Посмотреть сообщение
Можете, пожалуйста, дать аналогичный код, только для шифрования?
Попробуйте самостоятельно написать.
0
0 / 0 / 0
Регистрация: 07.07.2022
Сообщений: 93
12.06.2024, 12:21  [ТС]
Послушайте, если бы я не пробовал самостоятельно написать код, я бы не писал Вам с такой дурацкой просьбой. Мне просто нужна помощь. Я попытался сделать аналогию Вашего код, только для шифрования. Вот, что вышло:
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
 static List<byte> Encrypt(byte[] buffer, string key)
 {
     var returnTo = new List<byte>(0);
     using (var rsa = new RSACryptoServiceProvider())
     {
         rsa.FromXmlString(key);
 
         const int CHUNK = 256;
         int chunks = buffer.Length / CHUNK + (buffer.Length % CHUNK > 0 ? 1 : 0);
 
         byte[] decrypted = new byte[CHUNK];
         for (int i = 0; i < chunks; i++)
         {
             Console.WriteLine("3");
             int offset = i * CHUNK;
             int size = Math.Min(CHUNK, buffer.Length - offset);
             ReadOnlySpan<byte> bufferSpan = buffer.AsSpan()[offset..(offset + size)];
 
             int bytesWritten = rsa.Encrypt(bufferSpan, decrypted.AsSpan(), RSAEncryptionPadding.OaepSHA1);
 
             returnTo.Capacity += bytesWritten;
             returnTo.AddRange(decrypted.AsSpan()[..bytesWritten]);
         }
     }
 
     return returnTo;
 }
Этот код доходит до цикла, пишет в консоль "3" и всё. Процесс замораживается. Сервер не отвечает и не выходит из цикла.
0
Эксперт .NET
 Аватар для Rius
13164 / 7724 / 1679
Регистрация: 25.05.2015
Сообщений: 23,527
Записей в блоге: 14
12.06.2024, 13:27
В 13 посте код и шифрования, и дешифрования, произвольного объёма.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru